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

问题描述 投票:0回答:2

如果我将一个向量传递给函数作为参考,我希望函数不应该修改向量,那么更好 - 使用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

c++ c++11 vector
2个回答
5
投票

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

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

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

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.
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.