gpt4 book ai didi

c++ - 列表迭代器 Remove()

转载 作者:IT老高 更新时间:2023-10-28 22:32:05 29 4
gpt4 key购买 nike

我有一个列表迭代器,它遍历一个列表并删除所有偶数。我可以使用列表迭代器很好地打印出数字,但我不能使用列表的 remove() 并传入取消引用的迭代器。

我注意到当 remove() 语句生效时,*itr 被破坏了?有人可以解释一下吗?

#include <iostream>
#include <list>

#define MAX 100

using namespace std;

int main()
{
list<int> listA;
list<int>::iterator itr;

//create list of 0 to 100
for(int i=0; i<=MAX; i++)
listA.push_back(i);

//remove even numbers
for(itr = listA.begin(); itr != listA.end(); ++itr)
{
if ( *itr % 2 == 0 )
{
cout << *itr << endl;
listA.remove(*itr); //comment this line out and it will print properly
}
}
}

最佳答案

上面的代码存在一些问题。首先,remove 将使任何指向已删除元素的迭代器无效。然后继续使用迭代器。很难判断 remove 在一般情况下会删除哪些元素(尽管在你的情况下不是),因为它可以删除多个。

其次,您可能使用了错误的方法。 Remove 将遍历列表中的所有项目以查找任何匹配的元素-在您的情况下这将是低效的,因为只有一个。看起来您应该使用 erase 方法,您可能只想删除迭代器位置处的项目。 erase 的好处是它返回一个位于下一个有效位置的迭代器。使用它的惯用方式是这样的:

//remove even numbers
for(itr = listA.begin(); itr != listA.end();)
{
if ( *itr % 2 == 0 )
{
cout << *itr << endl;
itr=listA.erase(itr);
}
else
++itr;
}

最后,你也可以使用 remove_if 来做同样的事情:

bool even(int i) { return i % 2 == 0; }

listA.remove_if(even);

关于c++ - 列表迭代器 Remove(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1016307/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com