我有以下for循环,迭代传递给引用的向量
void PrintVector(const vector<string>& myVector) {
for(vector<string>::iterator itr = myVector.begin(); itr != myVector.end(); ++itr)
someFunctionThatTakesAPassByReferenceToConstParameter(itr);
}
迭代器itr
作为引用传递给函数someFunctionThatTakesAPassByReferenceToConstParameter()
。因此,可以保证此函数不会更改迭代器对象。即使这是有保证的,为什么代码不能编译?
答案 0 :(得分:5)
我知道我可以使用const_iterator。但我想知道为什么会这样 不编译。
vector类将有两个不同的“begin”函数(在constness上重载)。类似的东西:
const_iterator begin() const { return ...; }
和
iterator begin() { return ...; }
由于你有一个对向量的const引用,前者将被调用,并且const_iterator不能转换为迭代器(因为迭代器可以修改“指向”的值)。
答案 1 :(得分:4)
你需要
vector<string>::const_iterator itr = myVector.begin();
如果myVector
是const引用。
答案 2 :(得分:2)
使用vector<string>::const_iterator
,即const向量的begin()
返回。
答案 3 :(得分: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)
答案 4 :(得分:1)
您应该传递*itr
来传递字符串。
答案 5 :(得分:1)
所以其他人已经指出你必须使用什么,你似乎对此不感兴趣。你在评论中的另一个问题是:
我可以用[i。即
const_iterator
]。但是我想知道为什么这不能编译。
答案是:因为取消引用时可能会修改非const
迭代器,并且对const
对象的引用不允许这样做。