[英]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.