此循环在运行时更改迭代器:
std::vector<int> c;
c.push_back(1);
c.push_back(2);
std::vector<int>::iterator iter = c.begin();
std::vector<int>::iterator endIter = c.end();
while( iter != endIter )
{
std::cout << (*iter) << std::endl;
iter = c.erase(iter);
}它不能工作,因为:
迭代器和对擦除元素的引用以及它们与容器末端之间的元素的引用无效。过去的迭代器也是无效的。
我如何重写它(不使用std::list,也不用while循环)?
顺便说一句,我知道auto是从C++11开始实现的,为什么使用它会有好处呢?
发布于 2013-06-17 17:21:12
只需不缓存将失效的结束迭代器:
while( iter != c.end() )
{
std::cout << (*iter) << std::endl;
iter = c.erase(iter);
}或打印后清除矢量:
for(const auto& i : c) {
std::cout << i << std::endl;
}
c.clear();发布于 2013-06-17 17:21:00
擦除元素会更改end()。更改循环:
while( iter != c.end())发布于 2013-06-17 17:21:56
任一
或
这是在这种情况下通常使用的两种通用方法。
https://stackoverflow.com/questions/17153123
复制相似问题