List Iterator Remove() [英] List Iterator Remove()

查看:472
本文介绍了List Iterator Remove()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个列表迭代器,通过一个列表,删除所有的偶数。我可以使用列表迭代器打印出数字很好,但我不能使用列表的remove()和传递的解引用的迭代器。

I have a list iterator that goes through a list and removes all the even numbers. I can use the list iterator to print out the numbers fine but I cannot use the list's remove() and pass in the dereferenced iterator.

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

I noticed that when the remove() statement is in effect, *itr gets corrupted? Can somebody explain this?

#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 会被擦除,因为它可以删除多个元素。

There are a few issues with your code above. Firstly, the remove will invalidate any iterators that are pointing at the removed elements. You then go on to continue using the iterator. It is difficult to tell which element(s) remove would erase in the general case (although not in yours) since it can remove more than one.

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

Secondly, you are probably using the wrong method. Remove will iterate through all of the items in the list looking for any matching elements - this will be inefficient in your case because there is only one. It looks like you should use the erase method, you probably only want to erase the item at the position of the iterator. The good thing about erase is it returns an iterator which is at the next valid position. The idiomatic way to use it is something like this:

//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 做与你在做的相同:

Finally, you could also use remove_if to do the same as you are doing:

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

listA.remove_if(even);

这篇关于List Iterator Remove()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆