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

C++ C++;:我可以从中间到末端重用/移动std::list元素吗?,c++,memory,iterator,micro-optimization,stdlist,C++,Memory,Iterator,Micro Optimization,Stdlist,我正在优化我的LRU缓存实现的常数因子,在这里我使用std::unordered_map将::迭代器s存储到std::list,即使添加或删除附近的元素,迭代器也保证保持有效。这将导致O(n)运行时,因此,我将使用常量因子 我知道每个迭代器基本上都是指向保存我的东西的结构的指针。当前,要将给定元素移动到链表的后面,我使用迭代器调用l.erase(it),然后分配一个新的对w/make\u pair(key,value)到l.push\u back()或l.emplace\u back()(不太确

我正在优化我的LRU缓存实现的常数因子,在这里我使用
std::unordered_map
::迭代器
s存储到
std::list
,即使添加或删除附近的元素,迭代器也保证保持有效。这将导致O(n)运行时,因此,我将使用常量因子

我知道每个迭代器基本上都是指向保存我的东西的结构的指针。当前,要将给定元素移动到链表的后面,我使用迭代器调用
l.erase(it)
,然后分配一个新的对w/
make\u pair(key,value)
l.push\u back()
l.emplace\u back()
(不太确定差异),并将新的迭代器重新插入映射w/

有没有一种方法可以重用现有的迭代器和它所指向的底层双链表结构,而不是每次都按照上面的方法销毁它

(我的运行时间目前为56ms(99.78%次),但对LeTeC+的最佳C++提交是50ms)。

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%!:-)

正如所指出的,解决方案是使用
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%!:-)

?根据您的描述,有点不清楚无序地图的键和值是什么,以及它与列表的关系。与分段相比,包含您希望优化的示例操作的a更具启发性。@HolyBlackCat,是的,似乎有效!而且也容易多了@HolyBlackCat,你想回答这个问题,还是我自己回答这个问题?遗憾的是,splice实际上并没有带来更快的运行时间。根据你的描述,无序映射的键和值到底是什么,以及它与列表的关系有点不清楚。与分段相比,包含您希望优化的示例操作的a更具启发性。@HolyBlackCat,是的,似乎有效!而且也容易多了@HolyBlackCat,你想回答这个问题,还是我自己回答这个问题?遗憾的是,splice实际上并没有带来更快的运行时间。好吧,这很有趣,因为这就像LeetCode上的一个非常老的问题,但是自从我两天前提交以来,有人的运行时间是40ms,而我的是52ms(比99,96%-两天前是100%)。他们只是根据解决方案中的输入来缓存答案,还是以某种方式进行合法的优化?!事实上,LeetCode可以让您在解决问题后看到解决方案,看起来40ms解决方案使用了一个
向量
来代替
列表
,它有自己的头和尾指针指向该向量的一部分,还有一些其他技巧。}有趣的是,它一定是让人提交这样一个解决方案的原因。:)好吧,这很有趣,因为这就像LeetCode上的一个很老的问题,但是自从我两天前提交以来,有人的运行时间是40ms,而我的是52ms(比99,96%要好,两天前是100%)。他们只是根据解决方案中的输入来缓存答案,还是以某种方式进行合法的优化?!事实上,LeetCode可以让您在解决问题后看到解决方案,看起来40ms解决方案使用了一个
向量
来代替
列表
,它有自己的头和尾指针指向该向量的一部分,还有一些其他技巧。}有趣的是,它一定是让人提交这样一个解决方案的原因。:)