1

我的清单如下所示:

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,则它们是相似的。

4

3 回答 3

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; 
                  });

正如其他人回答的那样:请重新考虑使用指针的想法,使用 a 可能是更好的设计list<event_t>(如果您真的不需要指针)。然后你就可以std::list::sort使用std::list::unique它了。

于 2013-09-10T21:41:55.493 回答
0

您可以排序然后使用unique

于 2013-09-10T21:43:46.783 回答
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; 
                                 });
于 2013-09-10T21:41:38.530 回答