- 主题:发现能正确写对for循环里删除iterator里指向的某个元素的不多
有些实现方式不需要手动写for循环遍历container;
有些实现方式需要手写for循环,比如要比较std::map<key, value>的value结构里的某些成员,
这种情况下有些写了几年c++的,也写不对:
for (auto it = myContainer.begin(); it != myContainer.end(); ) {
if (it->first == keyToDelete) {
myContainer.erase(it++);
} else {
++it;
}
}
for (auto it = myContainer.begin(); it != myContainer.end(); it++) {
if (it->first == keyToDelete) {
myContainer.erase(it);
}
}
--
修改:z16166 FROM 61.48.130.*
FROM 61.48.130.*
我从不在遍历容器的循环里直接删容器的成员,都是先记入待删除队列里面,等结束遍历之后从待删除队列里面一遍全删。
好处是不依赖容器的具体实现,不管是map还是hash_map或者flat_hash_map又或list、vect统统有效。
--
FROM 110.185.26.*
那待删除队列里面也只能记录map的key,而不能记录指向map的iterator了
【 在 poocp 的大作中提到: 】
: 我从不在遍历容器的循环里直接删容器的成员,都是先记入待删除队列里面,等结束遍历之后从待删除队列里面一遍全删。
: 好处是不依赖容器的具体实现,不管是map还是hash_map或者flat_hash_map又或list、vect统统有效。
--
FROM 61.48.130.*
这样效率不高。不过很多项目可能还到不了要抠这个效率的地步,写对为优先
【 在 ylh0315 的大作中提到: 】
: 是的。
--
FROM 61.48.130.*
当然是记录key,那玩意才是唯一特征而且不会变。
【 在 z16166 的大作中提到: 】
: 那待删除队列里面也只能记录map的key,而不能记录指向map的iterator了
--
FROM 110.185.26.*
这种得先取下一个iter,然后再删除当前iter吧...
不过前提是删除当前itor不会导致下一个itor无效,map和list应该是问题不大
【 在 z16166 的大作中提到: 】
: 有些实现方式不需要手动写for循环遍历container;
: 有些实现方式需要手写for循环,比如要比较std::map<key, value>的value结构里的某些成员,
: 这种情况下有些写了几年c++的,也写不对:
: ...................
--
FROM 221.218.208.*
不能假定容器实现。标准对删除操作是否可能造成迭代器失效是明确规定的。这种写法对链表和关联容器没问题,对数组和vector有性能问题,对deque则是错误实现。只从标准文本较真的话vector也是不保证的。
C++20引入erase, erase_if算法解决这个问题,确实有点晚了。以前顺序容器与链表可以remove_if还好,关联容器是要自己写。
对map,参考实现写法不是在删除时用i++而是利用erase返回值写 i=c.erase(i),更合理一些。
https://en.cppreference.com/w/cpp/container/map/erase_if
【 在 z16166 的大作中提到: 】
: 有些实现方式不需要手动写for循环遍历container;
:
: 有些实现方式需要手写for循环,比如要比较std::map<key, value>的value结构里的某些成员,
: ...................
--
修改:milksea FROM 117.172.56.*
FROM 117.172.56.*
对啊,我列的就是错误写法
【 在 milksea 的大作中提到: 】
: 不能假定容器实现。标准对删除操作是否可能造成迭代器失效是明确规定的。这种写法对链表和关联容器没问题,对数组和vector有性能问题,对deque则是错误实现。只从标准文本较真的话vector也是不保证的。
: C++20引入erase, erase_if算法解决这个问题,确实有点晚了。以前顺序容器与链表可以remove_if还好,关联容器是要自己写。
: 对map,参考实现写法不是在删除时用i++而是利用erase返回值写 i=c.erase(i),更合理一些。
: ...................
--
FROM 61.48.130.*
看标题,再看你列的例子,我还在想加个break就可以了。。。
原来是删除某类元素
【 在 z16166 的大作中提到: 】
: 有些实现方式不需要手动写for循环遍历container;
: 有些实现方式需要手写for循环,比如要比较std::map<key, value>的value结构里的某些成员,
: 这种情况下有些写了几年c++的,也写不对:
: ...................
--
FROM 106.37.229.*
哈哈,每次写这样的删除代码都是临时去 GOOGLE 搜索。
【 在 z16166 的大作中提到: 】
: 有些实现方式不需要手动写for循环遍历container;
: 有些实现方式需要手写for循环,比如要比较std::map<key, value>的value结构里的某些成员,
: 这种情况下有些写了几年c++的,也写不对:
: ...................
--
FROM 52.52.18.*