当vector作为reference-to-const传递时,C ++向量迭代代码无法编译

时间:2013-07-01 17:54:16

标签: c++ vector iterator

我有以下for循环,迭代传递给引用的向量

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

迭代器itr作为引用传递给函数someFunctionThatTakesAPassByReferenceToConstParameter()。因此,可以保证此函数不会更改迭代器对象。即使这是有保证的,为什么代码不能编译?

编辑:我知道我可以使用const_iterator。但是我想知道为什么这不能编译。

6 个答案:

答案 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对象的引用不允许这样做。