c++ - STL 列表删除项

标签 c++ stl

<分区>

Possible Duplicate:
Can you remove elements from a std::list while iterating through it?

我想在遍历时从列表中删除项目。我以前做过这个,但不知何故,这个简单的例子让我失望了。提前感谢您的帮助!

#include<iostream>
#include<list>
using namespace std;

void main()
{
    list<int> x;
    for ( int i =0;i<10; i++)
        x.push_back(i);

    for( list<int>::iterator k = x.begin(); k != x.end();k++)
        cout<<*k<<" ";

    cout<<endl;

    for( list<int>::iterator k = x.begin(); k != x.end();k++)
    {
        if ((*k)%2)
        {
            x.erase(k);
        }
    }

    cout<<endl;
    getchar();
}

最佳答案

只是 FWIW,你所说的也可以用(例如)std::list::remove_if 来完成:

template <class T>
class odd { 
    bool operator()(T const &value) { 
        return value % 2 != 0;
    }

};

// ...
x.remove_if(odd);

使用 C++ 0x 和/或 Boost lambda,您可以在不单独定义 even 的情况下执行此操作,这对于像这样的琐碎条件非常方便。从理论上讲,您还可以通过组合 std::bind1st、std::bind2nd、std::equal 和 std::modulus 来就地定义它——但是(IMO)结果将很难破译它是不可取。

请注意 std::list::remove_if(与 std::remove_if 不同)实际上会删除您要求删除的项目,而 std::remove_if 通常需要与对 erase 的调用相结合才能真正删除已删除的项目。

关于c++ - STL 列表删除项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3866642/

相关文章:

c++ - 如何在常量空间中对单向链表进行排序?

c++ - engOpen 返回 Null

c++ - Upper_bound 和 lower_bound 不编译

c++ - std::ofstream 不接受 << 运算符的 const char *

c++ - 删除存储了多个引用的指针

c++ - 在 push_back 中调用 copy_backward 会发生什么?

c++ - 为什么标准 C++ 容器适配器不提供明确的功能?

C++错误删除双端队列 vector 的元素

C++ 对结构 vector 进行排序

c++ - 这个数组交集的实现是如何工作的?