C++:我可以重用/移动 std::list 元素从中间到结尾吗?

C++: can I reuse / move an std::list element from middle to end?

本文关键字:中间 元素 结尾 std 我可以 C++ 移动 list      更新时间:2023-10-16

我正在优化我的 LRU 缓存实现的常量因子,我使用std::unordered_map::iterator存储到std::list,即使添加或删除附近的元素,它们也保证仍然有效。 这会导致 O(n( 运行时,因此,我将追求常量因子。

我知道每个迭代器基本上都是指向保存我的东西的结构的指针。 目前,要将给定元素移动到链表的后面,我使用迭代器调用l.erase(it),然后将一对带make_pair(key, value)的新对分配给l.push_back()l.emplace_back()(不太确定差异(,并获取新的迭代器以插入到带有prev(l.end())--l.end()的映射中。

有没有办法重用现有的迭代器和它指向的底层双向链表结构,而不是像上面那样每次都销毁它?

(我的运行时间目前是 56 毫秒(胜过 99.78%(,但在 leetcode 上提交的最佳C++是 50 毫秒。

正如HolyBlackCat所指出的,解决方案是使用std::list::splice

l.splice(l.end(), l, it);

这避免了任何l.erasemake_pair()l.push_back/l.emplace_back(),以及获取prev(l.end())/--l.end()来更新底层std::map的需要。

可悲的是,它并没有带来更好的运行时速度,但是,哦,好吧,可能是测量变化,或者使用更专业的数据结构实现。

更新:实际上,我修复了从l.begin()中重用"已删除"元素的最终实例,并得到了 52ms/100%! :-(