// insert、erase操作引起迭代器失效问题
#include "stdafx.h"
#include <iostream>
#include <list>
#include <vector>
#include <algorithm>
using namespace std;
void print_list(const list<int>& l)
{
list<int>::const_iterator it;
for(it=l.begin(); it!=l.end(); ++it)
{
cout<<*it<<ends;
}
cout<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
// 迭代器失效问题的解决方式:
// 确保传给insert、erase的迭代器在下次insert、erase操作时有效
// 一般是将迭代器重置为insert、erase返回值(再适当++、--)或者重新计算迭代器
int a1[] = { 1,2,3,4,5 };
int a2[] = { 1,2,6,7,8 };
list<int> list1(a1, a1+sizeof(a1)/sizeof(a1[0]));
list<int> list2(a2, a2+sizeof(a2)/sizeof(a2[0]));
// 删除list2中值属于list1的元素(1,2)
list<int>::iterator it;
for(it=list1.begin(); it!=list1.end(); ++it)
{
auto pos = find(list2.begin(), list2.end(), *it);
if(pos != list2.end())
{
list2.erase(pos);
}
}
print_list(list2);
// 在list2中插入属于list1但不属于list2的值(3,4,5)
for(it=list1.begin(); it!=list1.end(); ++it)
{
auto pos = find(list2.begin(), list2.end(), *it);
if(pos == list2.end())
{
// 每次pos都被重新定义和计算,无需重置pos为返回值,虽然这次操作后当前pos失效
list2.insert(pos, *it);
}
}
print_list(list2);
// 删除list2中值不属于list1的元素(6,7,8)
for(it=list2.begin(); it!=list2.end(); )
{
auto pos = find(list1.begin(), list1.end(), *it);
if(pos == list1.end())
{
// 注意迭代器失效问题,如果不保存it,it失效,则++it是未定义行为,
// it值必须同时改变为返回值(删除之后的迭代器)
it = list2.erase(it);
}
else
++it;
}
print_list(list2);
// 在list2中插入一次性5个属于list1又属于list2的值(1,2,3,4,5)
for(it=list1.begin(); it!=list1.end(); ++it)
{
auto pos = find(list2.begin(), list2.end(), *it);
if(pos != list2.end())
{
for(int i=0; i<5; ++i)
{
// 注意迭代器失效问题,如果不保存pos,pos失效第二次插入时pos已经失效
// 在pos之前插入,返回指向新元素的迭代器(pos-1)
pos = list2.insert(pos, *it);
// 确保每次在相同位置插入:第一次的pos之前
++pos;
// ++pos; // error! pos指向将不定
}
}
}
print_list(list2);
return 0;
}
容器insert、erase操作引起迭代器失效问题
最新推荐文章于 2023-08-31 00:12:22 发布