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