有没有一种方法可以从 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::map
、std::set
等做的事情:取出一个节点,修改它并把它放回去,根本没有重新分配.
是否有合理的解释为什么 std::list
缺少相同的功能,是否有解决方法来模仿现有的 class API?
有一个 std::list::splice
成员函数可能是您想要的。它对列表节点的内部指针进行操作。 我看不出拼接 from/to 同一个列表的方法,但是 你可以拼接一个临时的(空的)std::list
然后拼接回前面原始列表。
经审查,允许在同一列表内进行拼接。将整个列表拼接到自身是未定义的。可以将单个元素拼接到同一个列表中,也可以拼接一系列元素,只要目标位置不包含在拼接范围内即可。 (谢谢你,丹尼尔·兰格)
对于我的任务,我使用 std::list<Key>
来维护临时 LRU 缓存中元素的顺序。因此,其中一项常见操作是取出列表元素并将其放回列表的前面。
显然可以先用std::list::erase
再用std::list::push_front
来实现。但是,当我只想将列表节点移动到不同位置时,我不喜欢处理内存重新分配的想法。
这正是 extract
方法允许我们为 std::map
、std::set
等做的事情:取出一个节点,修改它并把它放回去,根本没有重新分配.
是否有合理的解释为什么 std::list
缺少相同的功能,是否有解决方法来模仿现有的 class API?
有一个 std::list::splice
成员函数可能是您想要的。它对列表节点的内部指针进行操作。 我看不出拼接 from/to 同一个列表的方法,但是 你可以拼接一个临时的(空的)std::list
然后拼接回前面原始列表。
经审查,允许在同一列表内进行拼接。将整个列表拼接到自身是未定义的。可以将单个元素拼接到同一个列表中,也可以拼接一系列元素,只要目标位置不包含在拼接范围内即可。 (谢谢你,丹尼尔·兰格)