C++:我可以重用/移动 std::list 元素从中间到结尾吗?
C++: can I reuse / move an std::list element from middle to end?
我正在优化我的 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.erase
、make_pair()
、l.push_back
/l.emplace_back()
,以及获取prev(l.end())
/--l.end()
来更新底层std::map
的需要。
更新:实际上,我修复了从l.begin()
中重用"已删除"元素的最终实例,并得到了 52ms/100%! :-(
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 2D数组来自文本输入,中间有空格
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 如何输入数组的元素,每次获得新元素时,我们将其放在数组的中间?
- C++:我可以重用/移动 std::list 元素从中间到结尾吗?
- 如何使用第一个、中间和最后一个元素的中位数正确分区?
- 使用 std::move 在开始时插入矢量的中间元素不起作用
- 当中间元素选择为枢轴时,快速排序C 不起作用
- 将元素插入到中间的矢量中
- 如何更改元素中间的文本样式
- std::multiset并查找中间元素
- 在合并排序中选择中间元素
- 删除单链表中间的元素
- 从中间删除元素的最佳数据结构是什么
- TinyXML2 -在XML中间插入元素
- 使用中间元素作为透视C++计算快速排序中的比较数
- 对于可移动类型,删除std::向量中间的元素仍然很昂贵吗
- 如何找到地图的中间元素??STL