[英]Remove a list item from list in the item's member function
假设我有一个列表list<Item>
,并且
class Item {
public:
Item(list<Item>& l); // l is the list the item is in.
RemoveItself() {...} // remove this from l.
}
当我调用item.RemoveItself()
时,它会将自身从列表中删除。 如果我自己实现这个,我可以在Item
中有prev_ptr
和next_ptr
,然后一切都很容易。 我想知道是否有办法使用 STL 来做到这一点?
您的list
包含Item
对象,这些对象将是您插入list
中的任何Item
的副本。 因此,您必须使用std::find_if()
和list::erase()
或list::remove_if()
来删除比较等于*this
的元素,例如:
class Item {
private:
list<Item> &l;
public:
Item(list<Item> &l) : l(l) {}
void RemoveItself() {
auto iter = std::find_if(l.begin(), l.end(),
[this](const Item &elem){
return true/false based on some condition of elem and this representing the same item...;
}
);
if (iter != l.end())
l.erase(iter);
// or:
l.remove_if(
[this](const Item &elem){
return ...;
}
);
}
};
这可能不是你想要的。 一个Item*
指针列表可能更合适( list<Item*>
),例如:
class Item {
private:
list<Item*> &l;
public:
Item(list<Item*> &l) : l(l) {}
void RemoveItself() {
auto iter = std::find(l.begin(), l.end(), this);
if (iter != l.end())
l.erase(iter);
// or:
l.remove(this);
}
};
在这种情况下,如果Item()
构造函数将this
添加到list
,那么它也可以将iterator
保存到新元素,然后它可以稍后简单地删除该元素:
class Item {
private:
list<Item*> &l;
list<Item*>::iterator l_iter;
public:
Item(list<Item*> &l) : l(l) { l_iter = l.insert(l.end(), this); }
void RemoveItself() {
l.erase(l_iter);
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.