- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图保留一个特定(基)类实例的全局列表,以便我可以随时通过遍历此全局列表来跟踪它们。
我认为解决这个问题的最合适方法是使用侵入式列表。例如,我听说人们可以通过深入研究 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/
我想使用 std::forward_list 因为: Forward list is a container which supports fast insertion and removal of
std::forward_list具有member function: size_type remove(const T& value); 和一个non-member function std::er
我正在阅读有关此功能工作方式的不同解释。 cplusplus.com说这个函数应该“直接在 i 之后移动元素”。 然而cppreference.com表示它拼接元素 AT i。 MSvisual st
我有一个 std::forward_list我有一个类 Delegate (取自 here )是一个具有可变类型签名( typename return_type, typename... Args )
我正在尝试完成一个在给定 x 值时计算多项式的程序。多项式使用 STL 的 forward_list 存储在类的对象中。 class PolyTerm { private: int
我需要实现一个请求列表,一次发送一个请求(节流)并等待答复(始终按顺序)。因此操作是: 插入(在末尾) 删除(开始时) 向前走(“已发送”指针) 我刚刚发现了 std::forward_list,并且
As per this question , 和 假设我有一个对容器本身的可变引用 ,可以使用以下方法安全地删除迭代器的常量性: foo::const_iterator cit = ... ; foo
我正在尝试创建一个带有 forward_list 的按字母顺序排序的列表。计划是将所有元素与我要插入列表的元素进行比较,如果它大于一个元素,则将其插入。但问题是我想不出在最后一个元素之后插入元素的方法
我正在研究弗洛伊德的 Tortoise and Hare algorithm ,并尝试使用 std::forward_list 对问题建模。具体来说,我想使用 std::forward_list 有意
我正在实现一个非常简单的图模型,其中我有一个包含前向列表的结构,该列表带有指向它的邻居的指针。这些邻居又是相同类型的结构。 #include #include #include #include
我会为 C++11 forward_list 的节点创建一个内存池。 是否可以将 BOOST 池内存与 std::forward_list 一起使用? 最佳答案 This stack-overflow
我有两个转发列表:list1和 list2 .我想遍历第一个并根据条件将元素转移到第二个。这是一个使用 forward_list 的例子那行不通,但我认为表达了我想要的。 #include #inc
标准委员会选择为 std::forward_list 实现 API 是否有某种原因使其不满足序列 容器概念要求? Sequence 概念要求指定容器必须与以下表达式兼容: c.insert(it, v
这个问题在这里已经有了答案: std::forward_list and std::forward_list::push_back (5 个答案) 关闭 9 年前。 forward_list 是一个
好吧,我认为这个问题已经很概括了。我有一个独特项目的 forward_list,并想从中删除单个项目: std::forward_list mylist; // fill with stuff myl
std::forward_list 提供了 insert_after 和 erase_after 成员,它们可能不需要实际访问 std::forward_list对象。因此,它们可以作为 static
我在 C++11 中遇到了一些困难。我想创建函数 isSorted 如果我的 std::forward_list 已排序则返回 true,否则返回 false。 我想象中的代码是这样的: templa
我试图保留一个特定(基)类实例的全局列表,以便我可以随时通过遍历此全局列表来跟踪它们。 我认为解决这个问题的最合适方法是使用侵入式列表。例如,我听说人们可以通过深入研究 Linux 内核来遇到这些生物
我知道 std::forward_list 是一个单链表。我想知道如何将第一个元素(头)移动到 forward_list 的末尾。没有拷贝或创建新节点! 我试过以下方法: std::forward_l
以下是一个很琐碎的问题,以前可能有人问过,但是,我无法通过搜索找到答案。 我想做的是使用 std::forward_list 在 C++ 中实现“Cracking the Coding Intervi
我是一名优秀的程序员,十分优秀!