概述
C++面试题经常会背问到vector和list的区别,其中就有一个问题就困扰我们的,面试官说vector在进行插入和删除元素的时候迭代器会失效,list不会,那这边由我来给大家举个列子:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v;
v.push_back(1);
std::vector<int>::iterator iter1 = v.begin();
v.push_back(1);//在迭代器后面插入了一个元素,因为容量不足,
//所以原空间的内存释放掉,迭代器还留着旧的迭代器上所以迭代器失效
int n = *iter1;//所以拿取第一个元素的值是没法拿取的
cout << n << endl;
return 0;
}
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v;
for (int i = 1; i < 100; i++)
{
cout << "capacity:" << v.capacity() << ", " << "size" << v.size() << endl;
v.push_back(i);
}
return 0;
}
选几个数据分析一下:
0-1-2-3-4-6-9-13-19-28-42-63-94-141
每次扩容50%
删除容器中数据的时候,缓冲区大小并不会改变,仅仅只是清楚了其中的数据,只有在析构函数调用的时候vector才会自动释放缓冲区。
int main()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
std::vector<int>::iterator iter1 = v.begin();
v.erase(iter1);
int n = *(iter1+1);
cout << n << endl;
return 0;
system("pause");
return 0;
}
int main()
{
list<int>s;
s.push_back(1);
s.push_back(2);
s.push_back(3);
s.push_back(4);
std::list<int>::iterator iter1 = s.begin();
//list没有报错的,list是可以的,所以这个就是和vector的区别
s.push_back(5);
cout<<*iter1<<endl;
system("pause");
return 0;
}
最后
以上就是个性红酒为你收集整理的vector迭代器失效的全部内容,希望文章能够帮你解决vector迭代器失效所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复