簡體   English   中英

如果已經存在類似元素,則從std :: list中刪除該元素

[英]Remove an element from std::list if a similar element is already present

我的清單如下:

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,則它們是相似的。

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

我假設您已經為class event_t定義了operator== 如果不是,則使用此版本:

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

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

您可以排序,然后使用unique

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM