繁体   English   中英

std :: forward_list —使用存储的迭代器擦除

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM