删除 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;
}
我有一个这样的用户定义结构:
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;
}