-2

我有以下 for 循环,它遍历一个通过引用传递给 const 的向量

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

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

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

4

6 回答 6

5

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

矢量类将有两个不同的“开始”函数(在常量上重载)。就像是:

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

  iterator begin() { return ...; }

由于您对向量有 const 引用,因此将调用前者,并且 const_iterator 不能转换为迭代器(因为迭代器能够修改“指向”的值)。

于 2013-07-01T18:02:23.687 回答
4

你需要

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

ifmyVector是一个常量引用。

于 2013-07-01T17:56:02.363 回答
2

use vector<string>::const_iterator,这就是begin()const 向量的返回值。

于 2013-07-01T17:55:46.157 回答
2

您没有包含编译器错误,但这似乎相当明显:

someFunctionThatTakesAPassByReferenceToConstParameter(itr);

这里,itr不是 a const string&,而是 a vector<string>::iterator。您需要取消引用迭代器:

someFunctionThatTakesAPassByReferenceToConstParameter(*itr);

这篇文章似乎是psudocode,但正如其他地方所提到的,你也应该使用const_iterator而不是iterator

for(vector<string>::const_iterator itr = myVector.begin(); itr != myVector.end(); ++itr)
于 2013-07-01T17:56:50.390 回答
1

你应该通过*itr传递字符串。

于 2013-07-01T17:56:26.617 回答
1

因此,其他人指出了您必须使用的内容,您似乎对此不感兴趣。您在评论中的另一个问题是:

我可以使用那个[即const_iterator]。但我想知道为什么这不能编译。

答案是:因为非const迭代器在取消引用时可能会被修改,而对对象的引用const不允许这样做。

于 2013-07-01T17:57:58.497 回答