std::forward_list 是否支持手动重新指向?

Does std::forward_list support manual re-pointing?

以下是一个很琐碎的问题,以前可能有人问过,但是我无法通过搜索找到答案。

我想做的是使用 std::forward_list 在 C++ 中实现 "Cracking the Coding Interview" 中的一些练习。在我的理解中,链表元素包含 a) 数据和 b) 指向下一个元素的指针。一些解决方案需要将 "next" 指针重新指向另一个元素,就像这样(伪代码)

node1.next = node1.next.next.next; // Effectively deletes 2 elements

但是,我在 forward_list documentation 中找不到任何方法来做到这一点?我错过了什么,还是根本不可能?

如果有人能指出正确的问题,我将非常高兴,谢谢!

你不能这样做。

您缺少的是标准库容器部分隐藏了它们的实现方式的细节。内部 "next" 指针是您不可见的实现细节。 (这与 std::forward_list 不太相关,它几乎肯定是一个单链表,但它与 std::set 相关:您无法访问内部 red/black 颜色字段,无论如何,不​​同的实现可以使用不同类型的自平衡树。)

删除下2个元素的正确方法是简单地使用std::forward_list的public API。

my_list.erase_after(iterator_to_node);
my_list.erase_after(iterator_to_node);

您不能在 std::forward_list 中进行手动重新指向,因为它对您隐藏了所有机制。这就是创建它的原因!

相反,您需要对其进行业务操作。例如,要从列表中删除元素,您需要调用 erase_after() - 它甚至具有一次性删除两个连续节点的重载。

您需要完成 public API 否则您可能会泄漏内存; forward_list 不提供对指针的直接访问,但在 erase_after and splice_after 之间,您可以寻求 forward_list 的帮助,以同样的效率完成相同的任务。

如果您在列表 mylist 中有一个迭代器 it,您可以执行相同的逻辑双元素删除以删除两个后续元素:

mylist.erase_after(it, std::next(it, 3));