【问题标题】:Move list element to the end in STL在 STL 中将列表元素移动到末尾
【发布时间】:2011-06-22 04:39:06
【问题描述】:

我已经有了CDrawObject*的列表指针

std::list<CDrawObject*> elements;

如何将某些元素移动到列表末尾。 我看到 STL Algorithms Reference 但我没有找到这个操作。我该怎么办?

【问题讨论】:

  • 不是 100% 与您的问题相关,但您确定指针链表是明智的数据结构选择吗?只有少数情况下我会认为它是最佳选择...
  • 他正在做的是将一个项目从列表的中间移动到末尾。 list 是唯一一个这样做是恒定时间的集合。
  • @CashCow:虽然时间不变,但可能仍然比 std::memmove() 容器的 std::vector 的内容要长,尤其是当数据的局部性(CPU 缓存)等方面考虑在内。

标签: c++ list stl


【解决方案1】:

使用列表方法splice()

void list::splice ( iterator position, list&lt;T,Allocator&gt;&amp; x, iterator i );

将迭代器 i 从列表 x 移动到当前列表的位置“位置”

因此把它移到最后放

x.splice( x.end(), x, iter );

(它们可以是同一个列表,也可以是不同的列表,只要移动项目的列表具有相同的类型,T和Allocator都是)

【讨论】:

  • 在您的示例中,如果 iter 已经指向最后一个元素怎么办?是否有必要对其进行特殊处理?
  • 应该不需要对其进行测试,并且库函数应该仍然可以工作。它是否是最优的并不确定,因为 C++ 规范只说明了一个函数的结果必须是什么,而不是它是否必须以最优的方式完成。
  • 警告:将拼接与列表一起使用存在危险。即使在拼接到自身时,它也会使所有迭代器无效......这对于列表数据类型有点出乎意料,其中使用列表的优点之一是它的大多数迭代器在添加删除时仍然有效。但这不是 splice 的情况,因此如果您指望这种行为,您可能希望使用此答案:stackoverflow.com/a/4912419/3768831
【解决方案2】:

std::list 是一个双向链表,这意味着您不能随机访问元素 n。你必须可以删除元素,然后使用push_back

【讨论】:

  • 不,你不必那样做,发帖人太快接受答案。
  • 我的意思不是“必须”的意思是“这是唯一的方法”,但无论如何,如果另一个答案更好,@G-71 随时不接受我的答案。
  • +1 对于指针容器完全可以接受。但是,如果复制 T 的成本更高,则应首选拼接。
  • 如果列表中包含自定义对象会出现问题。在这种情况下,remove 会破坏对象,而重新构造一个新对象可能并非易事。
  • 随机访问能力与将项目从一个(已知)位置(您已经有迭代器)移动到另一个位置的能力无关。
【解决方案3】:

删除它,然后将其附加到您的列表中。

【讨论】:

猜你喜欢
  • 2023-03-17
  • 2017-07-10
  • 1970-01-01
  • 2016-06-16
  • 2011-12-19
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多