#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <list>
#include <algorithm>
#include <numeric>
using namespace std;
int rand20()
{
return rand() % 20; //20以内的随机数
}
int main()
{
list<int> allInts(10);
generate_n(allInts.begin(), 10, rand20);
cout << "删除前:";
for (int a : allInts)
{
cout << a << " ";
}
cout << endl;
int sum = accumulate(allInts.begin(), allInts.end(), 0); //做累加和,0是和的初值,需要头文件<numeric>
int average = sum / 10; //平均数
//删除小于平均数的元素
list<int>::iterator itr = allInts.begin();
cout << "平均数为:" << average << endl;
//错误示范:
//for (; itr != allInts.end(); ++itr)
//{
// if (*itr < average)
// {
// allInts.erase(itr); //程序报错,因为删除元素后,迭代器就变成了无效迭代器。删除元素后就找不到下一个元素位置了,++itr就无效了
// }
//}
//正确代码
//法一
for (; itr != allInts.end(); )
{
auto temp = itr; //将迭代器保存起来
itr++; //删除前itr已经指向下一个元素了
if (*temp < average)
{
allInts.erase(temp); //删除temp指向的元素
}
}
//法二
for (; itr != allInts.end(); )
{
if (*itr < average)
{
itr = allInts.erase(itr); //首先删除了itr指向的元素,erase()的返回值是删除元素的下一个元素的迭代器,也就是把itr指向了下一个元素
}
else
itr++;
}
cout << "删除后:";
for (int a : allInts)
{
cout << a << " ";
}
return 0;
}
【C++】无效迭代器的简单例子
于 2022-03-20 21:12:41 首次发布