std :: forward_list是否支持手动重定位?

时间:2016-03-31 21:08:51

标签: c++ linked-list std forward-list

以下是一个微不足道的问题,可能之前有人问过,但是,我无法通过搜索找到答案。

我想要做的是使用std :: forward_list来实现C ++中“破解编码面试”中的一些练习。在我的理解中,链表元素包含a)数据和b)指向下一个元素的指针。一些解决方案需要将“下一个”指针重新指向另一个元素,如此(伪代码)

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

但是,我在forward_list documentation找不到任何方法吗?我错过了什么,或者根本不可能?

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

3 个答案:

答案 0 :(得分:3)

您无法在erase_after()中进行手动重新登录,因为它隐藏了您的所有机制。这就是创建它的原因!

相反,您需要对其执行业务操作。例如,要从列表中删除元素,您需要调用onStart - 它甚至可以在一次删除中删除两个连续节点。

答案 1 :(得分:2)

你不能这样做。

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

删除后两个元素的正确方法是简单地使用my_list.erase_after(iterator_to_node); my_list.erase_after(iterator_to_node); 的公共API。

   1. Open the script in the Pig view in Ambari
   2. Below the query editor, there are 'Arguments'
   3. Choose +Add, then type in -useHCatalog

答案 2 :(得分:1)

您需要通过公共API工作,否则您可能会泄漏内存; forward_list并未提供对指针的直接访问权限,但在erase_aftersplice_after之间,您可以通过forward_list帮助完成相同的任务效率相等。

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

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