Удалите элемент из std :: list, если аналогичный элемент уже присутствует

Мой список выглядит так:

list<event_t*> my_list;
</event_t*>

Класс event_t выглядит так:

class event_t {

public:
 event_t(String *_session_time, String *_event_type, String *_table_name, String *_num_of_events);
 ~event_t();
 std::string table_name;
 std::string event_type; 
 pthread_mutex_t lock;
 pthread_cond_t cond;
 int num_of_events_threshold;
 ****** time_out; 
 int num_of_events_so_far; 
};

Я хочу удалить объект event_t, если подобный объект уже присутствует в списке. У меня есть указатель на объект, который нужно удалить. Как удалить его из списка? Два объекта event_t похожи, если они имеют одинаковое имя таблицы и один и тот же event_type.

3 ответа

в С++ 03 вы можете сделать это следующим образом:

struct equal {
 bool operator()(const event_t* t) {
 return *t == object_;
 } 
 event_t object_;
 equal(event_t object) : object_(object) {}
};

 event_t object;
 list<event_t*>::iterator pend = my_list.remove_if (equal(object));
</event_t*>

Я предполагаю, что вы определили operator== для вашего класса event_t. Если нет, используйте эту версию:

struct equal {
 bool operator()(const event_t* t) {
 return t->table_name == object_.table_name
 && t->event_type == object_.event_type;
 } 
 event_t object_;
 equal(event_t object) : object_(object) {}
 };

В С++ 0x (С++ 11) вы можете использовать лямбда-функцию как предикат для remove_if.

event_t* object;

my_list.remove_if([object](event_t* e){ 
 return e->table_name == toDelete->table_name 
 && e->event_type == toDelete->event_type; 
 });

Поскольку другие ответили: пожалуйста, переосмыслите идею использования указателей, может быть гораздо лучше использовать list (если вам действительно не нужны указатели). Затем вы можете просто std::list::sort и использовать std::list::unique на нем.


Один из способов - использовать std::list::remove_if.

event_t* toDelete;
// set toDelete
// Now remove all elements from the list that have the same table_name and event_type as toDelete
my_list.remove_if([toDelete](event_t* e){
 return e->table_name == toDelete->table_name &&
 e->event_type == toDelete->event_type; 
 });


Вы можете сортировать, а затем использовать уникальный.

licensed under cc by-sa 3.0 with attribution.