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