const向量和常量迭代器之间的区别

时间:2017-12-28 20:12:37

标签: c++ c++11 vector

如果我将向量传递给函数作为参考,并且我希望函数不应该修改向量,那么更好 - 使用const vector<>或使用vector::const_iterator

例如,我正在浏览从main()传递到foo()的向量。

void foo (const vector<int> &v1) {
vector<int>::const_iterator m;

for(m=v1.begin();m1!=v1.end();++m1)
//loop body

}

main()

int main() {
vector<int> v11={0,1,2,3,4};
foo(v11);
}

在这种情况下,v1应为constm应为const_iterator

2 个答案:

答案 0 :(得分:5)

如果您想阻止foo修改其参数,那么该参数应该被视为const。您将无法从对const的{​​{1}}引用获取非const迭代器,因为std::vector的非const限定版本std::vector::begin无法访问。

此外,我们有一种干净的方式来表达C ++ 11中的范围迭代:范围 - for循环。

void foo(const vector<int> &v1) 
{
    for(const auto& x : v1) { /* use x */ }
}

答案 1 :(得分:2)

  

在这种情况下,v1应该是const或m应该是const_iterator?

如果您决定传递迭代器,则需要传递两个参数 - 开头和结尾。否则,您将无法确定何时停止迭代。

以下不起作用。

void foo (vector<int>::const_iterator start) {
   // for(m=v1.begin();m1!=v1.end();++m1)
   for ( auto m1 = start; m1 != v1.end(); ++m1 ) // There is no way to compute v1.end().

   //loop body
}

以下作品。

void foo (vector<int>::const_iterator start, vector<int>::const_iterator end) {
   for (  auto m1 = start; m1 != end; ++m1 )
   //loop body
}

这意味着,您需要使用以下函数调用该函数:

foo(v11.begin(), v11.end());

除非需要支持使用向量内容的子集进行迭代,否则无需支持此版本的foo

另一方面,你可以毫不费力地支持两者。

void foo (vector<int>::const_iterator start, vector<int>::const_iterator end) {
   for (  auto m1 = start; m1 != end; ++m1 )
   //loop body
}

void foo (vector<int>::const& v) {
   foo(v.begin(), v.end());
}

允许你使用

vector<int> v11={0,1,2,3,4};
foo(v11); // Do something for all the elements of v11.
foo(v11.begin(), v11.begin()+2); // Do the same thing only for the first two elements of v11.