4

我正在尝试保留特定(基)类实例的全局列表,以便我可以随时通过遍历此全局列表来跟踪它们。

我相信解决这个问题的最合适的方法是使用侵入性列表。例如,我听说可以通过深入研究 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()吗?

4

1 回答 1

4

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并避免所有这些麻烦。

于 2013-09-20T04:15:28.147 回答