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));
以下是一个很琐碎的问题,以前可能有人问过,但是我无法通过搜索找到答案。
我想做的是使用 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));