vector(上):C++初阶学习第八弹——探索STL奥秘(三)——深入刨析vector的使用-CSDN博客
vector(中):C++初阶学习第九弹——探索STL奥秘(四)——vector的深层挖掘和模拟实现-CSDN博客
目录
前言:
一、vector的迭代器失效问题的本质
二、vector迭代器失效的原因
vector容器可能会发生迭代器失效的操作有以下几种:
1、引起底层空间改变的操作
例如:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v{ 1,2,3,4,5,6 };
auto it = v.begin();
while (it != v.end())
{
cout << *it << " ";
++it;
}
cout << endl;
return 0;
}
对于这样一个程序,我们定义了一个v,并用迭代器来实现全部访问,运行结果如下:
例如(错误示范):
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v{ 1,2,3,4,5,6 };
auto it = v.begin();
v.resize(100, 8); //这里会扩容
while (it != v.end())
{
cout << *it << " ";
++it;
}
cout << endl;
return 0;
}
运行结果:
2、进行指定元素删除的时候—erase
代码实例:
#include <iostream>
using namespace std;
#include <vector>
int main()
{
int a[] = { 1, 2, 3, 4 };
vector<int> v(a, a + sizeof(a) / sizeof(int));
// 使用find查找3所在位置的iterator
vector<int>::iterator pos = find(v.begin(), v.end(), 3);
// 删除pos位置的数据,导致pos迭代器失效。
v.erase(pos);
cout << *pos << endl; // 此处会导致非法访问
return 0;
}
运行结果:
3、在其他编译环境下的失效情况
4、string的迭代器失效
代码实例:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s("hello");
auto it = s.begin();
// 放开之后代码会崩溃,因为resize到20会string会进行扩容
// 扩容之后,it指向之前旧空间已经被释放了,该迭代器就失效了
// 后序打印时,再访问it指向的空间程序就会崩溃
//s.resize(20, '!');
while (it != s.end())
{
cout << *it;
++it;
}
cout << endl;
it = s.begin();
while (it != s.end())
{
it = s.erase(it);
// 按照下面方式写,运行时程序会崩溃,因为erase(it)之后
// it位置的迭代器就失效了
// s.erase(it);
++it;
}
}
运行结果:
三、vector迭代器失效的解决方法
例如1中的:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v{ 1,2,3,4,5,6 };
auto it = v.begin();
v.resize(100, 8); //这里会扩容
it = v.begin(); //使用前重新赋值
while (it != v.end())
{
cout << *it << " ";
++it;
}
cout << endl;
return 0;
}
运行结果:
四、总结
感谢各位大佬观看,创作不易,还请各位大佬点赞支持!!!