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

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

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

【问题讨论】:

    标签: c++ erase unordered-map


    【解决方案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() 可以使所有迭代器无效。因此,我认为没有办法避免(隐式)查找。好消息是后者可能很便宜。

      【讨论】:

        猜你喜欢
        • 2016-11-22
        • 2019-09-11
        • 1970-01-01
        • 2013-09-12
        • 1970-01-01
        • 2020-04-23
        • 1970-01-01
        • 1970-01-01
        • 2011-05-29
        相关资源
        最近更新 更多