首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于std::vector和在循环过程中更改集合的一个小问题

关于std::vector和在循环过程中更改集合的一个小问题
EN

Stack Overflow用户
提问于 2013-06-17 17:13:55
回答 4查看 518关注 0票数 9

此循环在运行时更改迭代器:

代码语言:javascript
复制
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开始实现的,为什么使用它会有好处呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-06-17 17:21:12

只需不缓存将失效的结束迭代器:

代码语言:javascript
复制
while( iter != c.end() )
{
    std::cout << (*iter) << std::endl;
    iter = c.erase(iter);
}

或打印后清除矢量:

代码语言:javascript
复制
for(const auto& i : c) {
    std::cout << i << std::endl;
}
c.clear();
票数 22
EN

Stack Overflow用户

发布于 2013-06-17 17:21:00

擦除元素会更改end()。更改循环:

代码语言:javascript
复制
while( iter != c.end())
票数 12
EN

Stack Overflow用户

发布于 2013-06-17 17:21:56

任一

  • 把它重写为 时间( iter != c.end() ){ std::cout << (* iter ) << std::endl; 代码将不再依赖于任何可能失效的迭代器,

  • 在每次无效操作之后,“刷新”任何可能失效的迭代器 时间( iter != endIter ){ std::cout << (* iter ) << std::endl;iter= c.erase(iter);endIter = c.end();}

这是在这种情况下通常使用的两种通用方法。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17153123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档