我的列表如下:
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,则它们是相似的。
答案 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。