删除 std:list<User_Define> 中满足特定条件的元素的最佳方法是什么?

What is the best way to remove elements in a std:list<User_Define> that satisfy certain conditions?

我有一个这样的用户定义结构:

struct Cell{
   int dirty;
   double data;
   Cell* c;
 //  bool operator==(const struct Cell& other) {
 //   /* I am not sure if I need this function here...*/
 //  }
};

然后,我定义了一个这样的列表:

list<Cell> cell_list;

我要做的是删除"cell_list"中满足条件

的所有元素
(certain_cell.dirty == 1)

谁能教教我如何有效地实现上述操作?

list其实有一个成员函数叫remove_if:

cell_list.remove_if([](const Cell& cell){
    return cell.dirty == 1;
});

不使用 lambda(即 C++11 之前的版本):

#include <iostream>
#include <list>

struct Cell {
    bool dirty;
    Cell(bool dirt=false) : dirty(dirt) { }
};

typedef std::list<Cell> CellList;

bool isDirty(const Cell& c) {
    return c.dirty;
}

int main() {
    CellList cells;
    cells.push_back(Cell());
    cells.push_back(Cell());
    cells.push_back(Cell(true));
    cells.push_back(Cell());
    cells.push_back(Cell(true));

    for (CellList::const_iterator i=cells.begin(); i!=cells.end(); ++i)
        std::cout << i->dirty << '\n';
    std::cout << '\n';

    cells.remove_if( isDirty );

    for (CellList::const_iterator i=cells.begin(); i!=cells.end(); ++i)
        std::cout << i->dirty << '\n';
    std::cout << '\n';
}

这可以用于所有容器,但可能效率很低 在连续容器上,例如 vector。这个可以特来 如果你想处理所有的,并删除一些元素 一次列表。

list<Cell> cells;
list<Cell>::iterator itr = cells.begin();
while( itr != cells.end() )
{
    if( itr->dirty == 1 )
        itr = cells.erase(itr);
    else
        ++itr;
}