[英]std::forward_list — erasing with a stored iterator
我试图保留一个特定(基)类实例的全局列表,以便我可以随时通过遍历该全局列表来跟踪它们。
我相信解决这个问题的最合适方法是使用侵入式列表。 我听说有人可以通过例如研究Linux内核来遇到这些生物。
在我所处的情况下,我实际上并不需要这种性能保证,而使用侵入式列表会使我的事情变得有些复杂。
到目前为止,我已经实现了这个了解所有实例的类的概念。
class A {
static std::forward_list<A*> globallist;
std::forward_list<A*>::iterator listhandle;
public:
A() {
globallist.push_front(this);
listhandle = globallist.begin();
}
virtual ~A() {
globallist.erase_after(...); // problem
}
};
问题是,没有forward_list::erase()
,而且它看起来确实不像将globallist.before_begin()
保存在ctor中会对我有很大的帮助。 我从不应该取消引用before_begin()
的迭代器。 它实际上会保持住该位置吗? 如果我保存了before_begin
的迭代器,然后保存了一个新项push_front()
,则该迭代器可能仍然无法取消引用,但是可用于发送到erase_after()
吗?
forward_list
是单链接列表。 要在中间删除一个节点,您必须以某种方式指向上一个节点。 例如,您可以执行以下操作:
class A {
static std::forward_list<A*> globallist;
std::forward_list<A*>::iterator prev_node;
public:
A() {
A* old_head = globallist.front();
globallist.push_front(this);
prev_node = globallist.before_begin();
old_head->prev_node = globallist.begin();
}
};
将第一个元素压入一个空列表的情况以及删除逻辑留给读者练习(删除时,将prev_node
复制到下一个节点的prev_node
)。
或者,只需使用std::list
避免所有此类麻烦。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.