如果我将一个向量传递给函数作为参考,我希望函数不应该修改向量,那么更好 - 使用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
应该是const
或m
应该是const_iterator
?
如果你想阻止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 */ }
}
在这种情况下,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.