Каков наилучший способ удаления элементов из std: list & lt; User_Define & gt; что удовлетворяет определенным условиям?

У меня есть пользовательская структура, как это:

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)

Кто-нибудь может дать мне несколько инструкций о том, как эффективно реализовать вышеуказанные операции?

0

Решение

Чтобы сделать это без лямбды (то есть до 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';
}
2

Другие решения

list на самом деле имеет функцию-член с именем remove_if:

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

Это может использоваться для всех контейнеров, но может быть весьма неэффективным
на непрерывных контейнерах, таких как vector, Это может особенно прийти
удобно, если вы хотите обработать все и удалить некоторые элементы
список за один проход.

list<Cell> cells;
list<Cell>::iterator itr = cells.begin();
while( itr != cells.end() )
{
if( itr->dirty == 1 )
itr = cells.erase(itr);
else
++itr;
}
0
По вопросам рекламы [email protected]