2013-09-10 30 views
1

我的名單看起來像:取下的std ::列表中的元素,如果類似的元素已經存在

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

+2

我看不到需要指針。 – chris

+0

你在談論列表中的指針嗎? –

+0

是的,據我所知,這是完全沒有必要的。 – chris

回答

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

我假設你已經爲你的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就可以了。

+0

更好地使用容器的接口,而不是通用函數。 list.remove_if會更好。 – billz

+0

應爲my_list.remove_if ... – billz

+0

正確,謝謝,更改 – 4pie0

相關問題