c++容器迭代器失效问题
来源:互联网 发布:怪物猎人捏脸数据女库 编辑:程序博客网 时间:2024/06/10 21:10
一:迭代器失效问题
对于节点式容器(map,list,forward_list,set)元素的删除,插入操作会导致指向该元素的迭代器,指针,引用失效,但是其他元素迭代器,指针,引用不受影响
对于顺序式容器(vector,string)元素的插入肯定会导致指向该元素以及后面的元素迭代器,指针,引用失效,有可能会导致所有迭代器,指针,引用失效。取决于vector插入时预留的额外存储空间是否够用,需不需要重新分配新的存储空间,把原来存储在旧空间的元素全部复制到新的存储空间然后再插入新的元素,最后撤销旧的存储空间。但删除元素时,尾后迭代器总是失效,被删元素之前的迭代器,引用和指针仍有效
deque 插入到除首尾位置之外的任何位置都会导致迭代器,指针,和引用失效,如果是在首尾位置添加元素,迭代器会失效,但指向存在的元素的引用和指针不会失效。
在首尾之外的任何位置删除元素,那么指向被删除元素外的其他元素的迭代器,引用和指针都会失效,如果删除的是尾元素,尾后迭代器也会失效,但其他迭代器,引用和指针不受到影响,如果是删除首元素。这些也不会受到影响
最保险的方式是,当使用一个容器的insert或者erase函数通过迭代器插入或删除元素时,获取insert和erase返回的指向下一个元素的迭代器,以便用来重新获取新的有效的迭代器
erase返回的迭代器已经指向下一个元素,调用insert后,需要递增迭代器2次,在给定位置之前插入新元素,返回指向新插入的元素的迭代器
不要保存end返回的迭代器,必要时候重新调用end方法
#include<iostream>#include<vector>using namespace std;int main(){ vector<int> array; array.push_back(1); array.push_back(6); array.push_back(3); array.push_back(6); array.push_back(6); array.push_back(2); vector<int>::iterator itor; for(itor=array.begin();itor!=array.end();) { if(6==*itor) { itor=array.erase(itor); } else{itor++; } } itor=array.begin(); for(itor=array.begin();itor!=array.end();) { cout<<(*itor++); }system("pause");return 0;}
阅读全文
0 0
- 容器迭代器失效问题
- STL容器迭代器失效问题
- STL容器迭代器失效问题
- STL容器迭代器失效问题
- STL容器迭代器失效问题
- STL容器迭代器失效问题
- c++容器迭代器失效问题
- 容器erase迭代器失效的问题
- C++中容器迭代器删除失效问题
- 容器迭代器的失效
- 容器迭代器失效
- 删除容器中元素时的迭代器失效问题
- map和set关联容器迭代器失效的问题
- 容器insert、erase操作引起迭代器失效问题
- c++关于顺序容器指针迭代器失效问题
- 【STL源码剖析读书笔记】STL容器迭代器失效问题总结
- c++关于顺序容器指针迭代器失效问题
- STL源码剖析-STL容器迭代器失效问题总结
- rtsp协议总结
- Oracle内存全面分析 2
- RAID、LVM(逻辑卷)的相关用法
- 阿里巴巴2017年秋招(测试开发工程师)编程题:组队问题
- [欧拉路] Codeforces Round #407 (Div. 1) 788B. Weird journey
- c++容器迭代器失效问题
- .NET Core 2.0迁移技巧之MemoryCache问题修复
- Oracle内存全面分析 3
- CodeForces 788B 浅谈并查集维护奇妙欧拉回路
- AT24C02之典型电流参数
- Oracle内存全面分析 4
- 多线程mutex_lock的使用
- 大数加法
- Node.js的模块导出exports 和 module.exports 的区别