有效擦除 tr1::unordered_map 中的元素

Posted

技术标签:

【中文标题】有效擦除 tr1::unordered_map 中的元素【英文标题】:Efficiently erasing elements in tr1::unordered_map 【发布时间】:2011-09-19 16:23:02 【问题描述】:

我正在尝试使用 tr1::unordered_map 并偶然发现了如何解决的问题 有效地删除元素。 'erase' 方法提供通过键删除或 通过迭代器。我会假设后者更有效,因为前者 大概涉及隐式查找操作。另一方面我的调查 在互联网上透露,迭代器在调用后可能会失效 insert() 方法。

我对一个典型的现实情况感兴趣,其中对象放入哈希表 有一个足够长的生命周期,以便在此期间调用 insert() 寿命。因此,我可以得出结论,在这种情况下,按键删除是唯一的 剩下的选项?有没有其他方法可以更有效地删除对象?我是 充分意识到该问题仅在发生删除的应用程序中很重要 经常。我目前的项目是否会出现这种情况,还有待观察,但 我宁愿在设计我的项目时了解这些问题,而不是什么时候 已经有很多代码了。

【问题讨论】:

【参考方案1】:

无序容器的全部意义在于具有尽可能快的查找时间。担心按键擦除元素所花费的时间听起来像是过早优化的经典示例。

【讨论】:

+1 没有任何分析,这肯定闻起来像是过早的优化。【参考方案2】:

如果这对您很重要,因为您出于其他原因保留迭代器,那么 C++0x 在 23.2.5/11 中提到了 std::unordered_map(引自 FDIS):

insert 和 emplace 成员不影响 迭代器 if (N+n)

我没有检查tr1 规范是否具有相同的保证,但基于预期的实现,它是相当合乎逻辑的。

如果您可以使用此保证,那么您可以在一定程度上保护您的迭代器。不过,正如马克所说,unordered_map 中的查找应该很快。在 vector 中保留键而不是迭代器比在 vector 中保留索引而不是迭代器更糟糕,但比 map 中的等价物要好。

【讨论】:

【参考方案3】:

是的,insert() 可以使所有迭代器无效。因此,我认为没有办法避免(隐式)查找。好消息是后者可能很便宜。

【讨论】:

以上是关于有效擦除 tr1::unordered_map 中的元素的主要内容,如果未能解决你的问题,请参考以下文章

C++中python dict和tr1::unordered_map的区别

Emscripten:致命错误:找不到“tr1/unordered_map”文件

对于 std::tr1::unordered_map,是不是有任何等效的 std::algorithm 类似于 std::map::lower_bound?

unordered_map 迭代器会改变吗?

bzoj3307:雨天的尾巴

P4549 模板裴蜀定理