有没有一种方法可以从 std::list 中提取节点,类似于 std::map::extract 所做的?

Is there a way to extract a node from std::list similar to what std::map::extract does?

对于我的任务,我使用 std::list<Key> 来维护临时 LRU 缓存中元素的顺序。因此,其中一项常见操作是取出列表元素并将其放回列表的前面。

显然可以先用std::list::erase再用std::list::push_front来实现。但是,当我只想将列表节点移动到不同位置时,我不喜欢处理内存重新分配的想法。

这正是 extract 方法允许我们为 std::mapstd::set 等做的事情:取出一个节点,修改它并把它放回去,根本没有重新分配.

是否有合理的解释为什么 std::list 缺少相同的功能,是否有解决方法来模仿现有的 class API?

有一个 std::list::splice 成员函数可能是您想要的。它对列表节点的内部指针进行操作。 我看不出拼接 from/to 同一个列表的方法,但是 你可以拼接一个临时的(空的)std::list 然后拼接回前面原始列表。

经审查,允许在同一列表内进行拼接。将整个列表拼接到自身是未定义的。可以将单个元素拼接到同一个列表中,也可以拼接一系列元素,只要目标位置不包含在拼接范围内即可。 (谢谢你,丹尼尔·兰格)