gpt4 book ai didi

c++ - std::forward_list -- 用存储的迭代器删除

转载 作者:太空狗 更新时间:2023-10-29 21:23:09 26 4
gpt4 key购买 nike

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

我认为解决这个问题的最合适方法是使用侵入式列表。例如,我听说人们可以通过深入研究 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(),它看起来真的不像在ctor中保存globallist.before_begin()会做很好。我永远不应该取消引用 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 即可避免所有这些麻烦。

关于c++ - std::forward_list -- 用存储的迭代器删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18908634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com