如果将指向向量的最后一个元素的迭代器加2,该怎么办?在这个问题中,如何通过2个元素将迭代器调整为STL容器,提供了两种不同的方法:
- 要么使用一种形式的算术运算符-+ = 2或++两次
- 或使用std :: advance()
当迭代器指向STL容器的最后一个元素或其他元素时,我已经用VC ++ 7测试了它们的边缘情况:
vector<int> vec;
vec.push_back( 1 );
vec.push_back( 2 );
vector<int>::iterator it = vec.begin();
advance( it, 2 );
bool isAtEnd = it == vec.end(); // true
it++; // or advance( it, 1 ); - doesn't matter
isAtEnd = it == vec.end(); //false
it = vec.begin();
advance( it, 3 );
isAtEnd = it == vec.end(); // false
我见过遍历vector和其他容器时可能会建议与vector :: end()进行比较:
for( vector<int>::iterator it = vec.begin(); it != vec.end(); it++ ) {
//manipulate the element through the iterator here
}
显然,如果迭代器前进到循环内的最后一个元素之后,则for-loop语句中的比较将计算为false,并且循环将愉快地继续进行未定义的行为。
如果我曾经在迭代器上使用advance()或任何类型的增量操作并将其指向容器的末端,我将无法检测到这种情况吗?如果是这样,最佳实践是什么-不要使用这种进步?