2013-07-01 37 views
-2

for循環我有以下過通過按引用給const矢量這就是通過,該迭代C++矢量迭代碼不編譯,當矢量作爲參考給const

void PrintVector(const vector<string>& myVector) { 
    for(vector<string>::iterator itr = myVector.begin(); itr != myVector.end(); ++itr) 
     someFunctionThatTakesAPassByReferenceToConstParameter(itr); 
} 

將迭代器itr作爲參考傳遞給函數someFunctionThatTakesAPassByReferenceToConstParameter()。因此,保證這個函數不會改變迭代器對象。即使這是有保證的,爲什麼代碼不能編譯?

編輯:我知道我可以使用const_iterator。但我想知道爲什麼這不編譯。

+0

':: const_iterator' ... – 2013-07-01 17:56:05

+0

_I我知道我可以使用const_iterator._這不是你可以,你只需要!正如Naveen指出的那樣通過'* itr'。 –

+0

-1這麼多答案,都涵蓋了你發佈的代碼中的各種缺陷,而且沒有一個值得接受?我會說@ JohnDibling的答案完全覆蓋了它。 –

回答

1

所以其他人指出你必須使用什麼,你似乎沒有興趣。你在評論中的另一個問題是:

我可以使用[我。即const_iterator]。但我想知道爲什麼這不編譯。

答案是:因爲提領時非const迭代器可能被修飾,並const對象的引用不允許這一點。

2

使用vector<string>::const_iterator,這是常量向量返回的begin()

+0

我可以使用它。但我想知道爲什麼這不編譯。 – Cricketer

+0

@ user2380088因爲解除引用時可能會修改非''contst'迭代器。 – 2013-07-01 17:56:39

+0

但編譯器可以看到我的代碼沒有這樣做。對? – Cricketer

4

你需要

vector<string>::const_iterator itr = myVector.begin(); 

如果myVector是const引用。

1

您應該通過*itr來傳遞字符串。

2

您不包括編譯器錯誤,但是這似乎相當明顯:

someFunctionThatTakesAPassByReferenceToConstParameter(itr); 

這裏,itr不是const string&,但vector<string>::iterator。您需要取消引用迭代器:

someFunctionThatTakesAPassByReferenceToConstParameter(*itr); 

這個職位似乎是psudocode,但在其他地方提到的,你也應該使用const_iterator而不是iterator

for(vector<string>::const_iterator itr = myVector.begin(); itr != myVector.end(); ++itr) 
5

我知道我可以使用const_iterator。但我想知道爲什麼這個 不編譯。

矢量類將有兩個不同的「開始」函數(在constness上重載)。喜歡的東西:

const_iterator begin() const { return ...; } 

iterator begin() { return ...; } 

既然你有一個const參考矢量前者將被調用,一個常量性不能轉化爲迭代器(因爲迭代器將能夠修改值「指向」)。