vector 迭代器失效
来源:互联网 发布:mac怎么下lol 编辑:程序博客网 时间:2024/05/18 11:47
首先看两段关于vector迭代器失效代码:
1、insert操作
#include <vector>#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){int arr[] = {87,65,73,47,75,73,78,65};vector<int>vec_scores(arr,arr+8);cout<<"its size:"<<vec_scores.size()<<"capaticy is :"<<vec_scores.capacity()<<endl;//vec_scores.reserve(18);int flag=0;for(vector<int>::iterator iter = vec_scores.begin(); iter != vec_scores.end(); ++iter){if(*iter == 73 && !flag) {flag =1;vec_scores.insert(iter,88);cout<<"\n插入后第三个元素:"<<*iter<<endl;cout<<"插入后第三个元素地址:"<<&(*iter)<<endl;cout<<"插入元素后vector分配的容量:" <<vec_scores.capacity() <<endl;continue;}cout << *iter<< endl;cout << &(*iter) << endl;}getchar();return 0;}运行结果:
如果放开注释 //vec_scores.reserve(18);
2、erase操作
#include <vector>#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){int arr[] = {87,65,73,47,75,73,78,65};vector<int>vec_scores(arr,arr+8);for(vector<int>::iterator iter = vec_scores.begin(); iter != vec_scores.end(); ++iter){if(*iter == 73) //删除第三个{vec_scores.erase(iter);}cout << *iter<< endl;cout << &(*iter) << endl;}getchar();return 0;}
运行结果:
由上面的代码可以看出,erase()操作导致迭代器失效,insert操作有可能导致迭代器失效(重新分配空间导致失效)
如何解决呢?
- insert(iter, value)
在迭代器i前插入一个元素value, 返回指向value迭代器 - erase(iter)
删除迭代器i位置的元素, 返回指向后一个元素的迭代器
- iter = insert(iter, value)
- iter = erase(iter)
将上面的代码insert和erase操作修改如下:
iter = vec_scores.insert(iter,88);
iter = vec_scores.erase(iter);修改后程序虽然没有崩溃,但是有逻辑问题,erase返回的是指向后一个元素的迭代器,然后itr++,相当于跳过了下一个元素,运行到最后还有可能崩溃,做如下修改
int arr[] = {87,65,73,47,75,73,78,65}; vector<int>vec_scores(arr,arr+8); for(vector<int>::iterator iter = vec_scores.begin(); iter != vec_scores.end();){ //避免跳过下一个元素,做出如下修改if(*iter == 73) //删除第三个 { iter = vec_scores.erase(iter++); }elseiter++;cout << *iter<< endl; cout << &(*iter) << endl; }
0 0
- vector的迭代器失效
- vector迭代器失效场景
- vector 迭代器失效
- vector迭代器失效问题
- C++ vector 迭代器失效原因
- vector和map的迭代器失效问题
- vector进行erase以后迭代器失效问题
- vector迭代器失效的一种情形
- map vector 迭代器失效问题 - 1
- vector迭代器失效解决方法 及 内存原理
- map和vector的迭代器失效问题
- vector迭代器失效的几种情况
- 关于vector的erase操作后,迭代器失效问题
- vector的earse造成迭代器失效的问题
- C++ Vector swap操作前后迭代器为何不失效
- C++ Vector swap操作前后迭代器为何不失效
- vector list map 遍历删除制定元素 防止迭代器失效
- STL vector,list,deque删除迭代器失效问题
- Linux程序设计(1)
- 如何给项目配置域名(此处以博客为例)
- UTF-8编码规则
- hexo3添加百度统计
- J2SE——Java Web——Java EE企业应用学习路线
- vector 迭代器失效
- 详解僵尸进程与孤儿进程
- 二分查找
- Bzoj4205卡牌配对
- hbase1.3.0集群版详细安装及简单测试
- CSS设计彻底研究
- spring 配置<context:component-scan base-package=” ”/>
- AndroidStudio如何依赖Module dependency?
- android爬坑篇之第三方框架引用