如果已存在类似元素,则从std :: list中删除元素

时间:2013-09-10 21:26:11

标签: c++ multithreading list class stl

我的列表如下:

list<event_t*> my_list;

类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;
   double time_out; 
   int num_of_events_so_far; 
};  

如果列表中已存在类似对象,我想删除event_t对象。我有一个指向要删除的对象的指针。如何从列表中删除它?如果两个event_t对象具有相同的table_name和相同的event_type,则它们是相似的。

3 个答案:

答案 0 :(得分:1)

在C ++ 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));

我假设您为班级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) {}
    };

在C ++ 0x(C ++ 11)中,您可以使用lambda函数作为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<event_t>设置可能要好得多(如果你真的不需要指针)。然后,您可以std::list::sort并在其上使用std::list::unique

答案 1 :(得分:0)

一种方法是使用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; 
                                 });

答案 2 :(得分:0)

您可以排序,然后使用unique