内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持
腾讯云小微IT领域专用引擎提供翻译支持
此循环在运行时更改迭代器:
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 循环)?
std::list
while
顺便说一句,我知道 auto 是从C++11开始实现的,为什么使用它会有好处呢?
auto
擦除元素会更改 end() 。更改循环:
end()
while( iter != c.end())
只需不缓存将失效的结束迭代器:
while( iter != c.end() ) std::cout << (*iter) << std::endl; iter = c.erase(iter); }
或打印后清除矢量:
for(const auto& i : c) {