vector迭代器失效的一种情形
来源:互联网 发布:淘宝c店代运营 编辑:程序博客网 时间:2024/05/18 15:52
使用过STL的人都应该知道关于迭代器失效的原理,这里以后vector迭代器失效为例:
第一种:当插入一个元素到vector中,如果插入后容器已满,那么容器将新开辟一块内存区域,然后将原内存中的数据拷贝到新的内存区域,同时释放旧的内存。这样之前指向旧内存的迭代器就会指向不确定内存,这块内存要么释放,要么释放后又用作其他用途。这便导致了迭代器失效。
第二种:当删除容器中一个元素后,该迭代器所指向的元素已经被删除,那么也造成迭代器失效。这里我们主要讨论下第二种情况。
我们先举个例子说明:
比如vector中存储了1,2,3,4,5,6,7,8,9,10 假如此时迭代器指向6.当我们erase这个迭代器的元素后,vecotr被删除元素后面的元素会依次前移动。变为1,2,3,4,5,7,8,9,10 此时迭代器指向元素7 也就是被删除元素的下一个元素。
所以当我们用以下测试代码测试的时候,发现会出现错误:
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 int main(int argc, char* argv[]) 6 { 7 std::vector<int> v1; 8 for(int i = 1;i <= 10;i++) 9 {10 v1.push_back(i);11 }12 13 for(vector<int>::iterator it = v1.begin();it != v1.end();)14 {15 if(*it==6)16 {17 v1.erase(it);18 }19 else20 {21 it++;22 }23 }24 25 for(it = v1.begin();it != v1.end();it++)26 {27 cout<<*it<<",";28 }29 cout<<endl;30 return 0;31 }
因为删除元素的所指的迭代器已经失效,但是由于erase方法会返回下一个有效的迭代器。所以我们再每次删除后让迭代器重新被erase返回即可。
所以修改后的代码如下:
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 int main(int argc, char* argv[]) 6 { 7 std::vector<int> v1; 8 for(int i = 1;i <= 10;i++) 9 {10 v1.push_back(i);11 }12 13 for(vector<int>::iterator it = v1.begin();it != v1.end();)14 {15 if(*it==6)16 {17 it=v1.erase(it);18 }19 else20 {21 it++;22 }23 }24 25 for(it = v1.begin();it != v1.end();it++)26 {27 cout<<*it<<",";28 }29 cout<<endl;30 return 0;31 }
运行结果:
0 0
- vector迭代器失效的一种情形
- 索引失效的情形
- vector的迭代器失效
- mysql索引失效的情形
- mysql索引失效的情形
- MYSQL索引失效的各种情形总结
- MYSQL索引失效的各种情形总结
- 多线程网络通信的一种情形
- 常遇到的一种闭包情形
- vector和map的迭代器失效问题
- map和vector的迭代器失效问题
- vector迭代器失效的几种情况
- vector迭代器失效场景
- vector 迭代器失效
- vector迭代器失效问题
- 使用fstream,ifstream,ofstream读写文件的一种情形
- 梦境能够被记忆的一种情形(真实体验)
- C++ 中必须加const的一种情形
- python reduce函数
- 在涉及到一些参数修改的时候,一定要和医院确认------运维日志32
- DuiLib(8)——Menu菜单的实现方式
- 派生类求两点间的距离、矩形的周长和面积
- hdu 1847 Good Luck in CET-4 Everybody! 博弈
- vector迭代器失效的一种情形
- hibernate5(9)注解映射[1]多对一单向关联
- Android控件 webView
- 方法的继承,覆写和重载
- 软件
- C#WindowsMediaPlayer的属性
- Nginx开机启动设置
- 反素数 51Nod1060 最复杂的数
- 【React Native开发】React Native移植原生Android项目(Mac用)