以下是一个微不足道的问题,可能之前有人问过,但是,我无法通过搜索找到答案。
我想要做的是使用std :: forward_list来实现C ++中“破解编码面试”中的一些练习。在我的理解中,链表元素包含a)数据和b)指向下一个元素的指针。一些解决方案需要将“下一个”指针重新指向另一个元素,如此(伪代码)
node1.next = node1.next.next.next; // Effectively deletes 2 elements
但是,我在forward_list documentation找不到任何方法吗?我错过了什么,或者根本不可能?
如果有人能指出我正确的问题,我感到非常高兴,谢谢!
答案 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_after
和splice_after
之间,您可以通过forward_list
帮助完成相同的任务效率相等。
如果您在列表it
中有一个迭代器mylist
,则可以执行相同的逻辑二元素删除,以删除两个后续元素:
mylist.erase_after(it, std::next(it, 3));