set容器erase怎么不行呢????

mirroatl143 2014-12-24 10:18:52

set<int> g_TexMoveRegain;
g_TexMoveRegain.insert(1);
g_TexMoveRegain.insert(2);
g_TexMoveRegain.insert(3);

for(std::set<int>::iterator it = g_TexMoveRegain.begin(); it != g_TexMoveRegain.end(); ++it){
if(*it == _id)
{
g_TexMoveRegain.erase(it);
}
}
...全文
195 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangyunzhao 2014-12-25
  • 打赏
  • 举报
回复
百度一下,在循环中删除迭代器,会有惊喜哦
赵4老师 2014-12-24
  • 打赏
  • 举报
回复
mirroatl143 2014-12-24
  • 打赏
  • 举报
回复

for(std::set<int>::iterator it = g_TexMoveRegain.begin(); it != g_TexMoveRegain.end(); ++it){
                         if(*it == _id)
                         {
                        g_TexMoveRegain.erase(it);
            }
}
我这写的和你有区别吗???


引用 1 楼 poy49295 的回复:
set<int> g_TexMoveRegain; g_TexMoveRegain.insert(1); g_TexMoveRegain.insert(2); g_TexMoveRegain.insert(3); for(std::set<int>::iterator it = g_TexMoveRegain.begin(); it != g_TexMoveRegain.end(); ){ if(*it == _id) { std::set<int>::iterator iterToBeDeleted= it++; g_TexMoveRegain.erase(iterToBeDeleted); } else { ++it; } }
mirroatl143 2014-12-24
  • 打赏
  • 举报
回复
失效是什么意思???
引用 3 楼 jianwen0529 的回复:
[quote=引用 2 楼 jianwen0529 的回复:] for(std::set<int>::iterator it = g_TexMoveRegain.begin(); it != g_TexMoveRegain.end(); ) { it = g_TexMoveRegain.erase(iterToBeDeleted); }
for(std::set<int>::iterator it = g_TexMoveRegain.begin(); it != g_TexMoveRegain.end(); ) { if(...) it = g_TexMoveRegain.erase(iterToBeDeleted); else ++it; } 插入删除元素会使迭代器失效!!去看一下相关概念!![/quote]
幻夢之葉 2014-12-24
  • 打赏
  • 举报
回复
引用 2 楼 jianwen0529 的回复:
for(std::set<int>::iterator it = g_TexMoveRegain.begin(); it != g_TexMoveRegain.end(); ) { it = g_TexMoveRegain.erase(iterToBeDeleted); }
for(std::set<int>::iterator it = g_TexMoveRegain.begin(); it != g_TexMoveRegain.end(); ) { if(...) it = g_TexMoveRegain.erase(iterToBeDeleted); else ++it; } 插入删除元素会使迭代器失效!!去看一下相关概念!!
幻夢之葉 2014-12-24
  • 打赏
  • 举报
回复
for(std::set<int>::iterator it = g_TexMoveRegain.begin(); it != g_TexMoveRegain.end(); ) { it = g_TexMoveRegain.erase(iterToBeDeleted); }
poy49295 2014-12-24
  • 打赏
  • 举报
回复
set<int> g_TexMoveRegain; g_TexMoveRegain.insert(1); g_TexMoveRegain.insert(2); g_TexMoveRegain.insert(3); for(std::set<int>::iterator it = g_TexMoveRegain.begin(); it != g_TexMoveRegain.end(); ){ if(*it == _id) { std::set<int>::iterator iterToBeDeleted= it++; g_TexMoveRegain.erase(iterToBeDeleted); } else { ++it; } }
arsenduan 2014-12-24
  • 打赏
  • 举报
回复
楼主用法有误, erase(iter)后, iter失效,再做++iter会导致意想不到的错误 建议用while(***){erase(iter++);}这样的用法
幻夢之葉 2014-12-24
  • 打赏
  • 举报
回复
引用 4 楼 mirroatl143 的回复:
失效是什么意思??? [quote=引用 3 楼 jianwen0529 的回复:] [quote=引用 2 楼 jianwen0529 的回复:] for(std::set<int>::iterator it = g_TexMoveRegain.begin(); it != g_TexMoveRegain.end(); ) { it = g_TexMoveRegain.erase(iterToBeDeleted); }
for(std::set<int>::iterator it = g_TexMoveRegain.begin(); it != g_TexMoveRegain.end(); ) { if(...) it = g_TexMoveRegain.erase(iterToBeDeleted); else ++it; } 插入删除元素会使迭代器失效!!去看一下相关概念!![/quote][/quote] 失效的意思就是迭代器变化了,不是原来的了! 你删除一个元素 g_TexMoveRegain.erase(iterToBeDeleted);返回一个迭代器,指向下一个元素,如果没有则会指向end() std::set<int>::iterator iterToBeDeleted= it++; g_TexMoveRegain.erase(iterToBeDeleted); 1L的就是先使迭代器指向下一个元素 然后再删除原来的元素 跟我写的it = g_TexMoveRegain.erase(iterToBeDeleted);这句是一样效果的!

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧