C++ 迭代器失效
Posted L_add
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 迭代器失效相关的知识,希望对你有一定的参考价值。
迭代器失效
迭代器失效实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间
迭代器失效有两种情况
1、意义改变
2、崩溃出现野指针
引起失效的操作:
1、指定位置元素的删除操作
void test_vector4()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
//1 2 3 4 5
vector<int>::iterator pos = find(v.begin(), v.end(), 3);
if (pos != v.end())
{
v.insert(pos, 30);
}
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
//1 2 30 3 4 5
//删掉3
v.erase(pos); //迭代器失效
//迭代器失效情况:1、pos的意义改变 2、可能会崩溃出现野指针
//这里是意义改变
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
//1 2 30 4 5
}
2、引起底层空间改变的操作
eg:resize,reserve,insert,assign,push_back等
void test_vector5()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
v.push_back(6);
//要求删除vector中所有偶数
vector<int>::iterator it = v.begin();
while (it != v.end())
{
if (*it % 2 == 0)
{//erase(it)以后it失效,不能++
it = v.erase(it);//erase返回删除位置it的下一个位置
}
else
it++;
}
}
以上是关于C++ 迭代器失效的主要内容,如果未能解决你的问题,请参考以下文章