for (std::vector::iterator iter = numbers.begin(); iter != numbers.end(); ++iter) { if (*iter == value) { numbers.erase(iter); } }
for (std::vector::iterator iter = numbers.begin(); iter != numbers.end(); ++iter) { if (*iter == value) { numbers.erase(iter); iter--; } }
for (std::vector::iterator iter = numbers.begin(); iter != numbers.end();) { if (*iter == value) { iter = numbers.erase(iter); } else { ++iter; } }
以上代码都不对
#include <vector> #include <iostream> #include <sstream> int main() { std::vector<int> vec{1,2,2,3,4,5,2,3,3,5}; std::ostringstream oss; for (auto v : vec) { oss << v << ","; } std::cout << "initial vec: " << oss.str() << std::endl; // for (std::vector<int>::iterator iter = vec.begin(); iter != vec.end(); ) { for (auto iter = vec.begin(); iter != vec.end(); ++iter) { if (*iter == 2) { vec.erase(iter); // continue; iter--; } // ++iter; } oss.str(""); for (auto v : vec) { oss << v << ","; } std::cout << "after delete 2, vec: " << oss.str() << std::endl; }
B 选项不严谨
参考: cppreference
里面的:
Invalidates iterators and references at or after the point of the erase, including the end() iterator.
The iterator pos must be valid and dereferenceable. Thus the end() iterator (which is valid, but is not dereferenceable) cannot be used as a value for pos.
可以清楚的看到, erase 容器内的元素之后,所有在 erase 元素之后的迭代器失效.在 erase 之后,继续遍历的话,那么在下一次遍历的时候,必须使用 erase 所返回的迭代器.
B 选项显然没有这么做,所以 B 是错的