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

时间:2011-09-19 16:23:02

标签: c++ erase unordered-map

我正在尝试使用tr1 :: unordered_map并偶然发现问题该怎么做 有效删除元素。 'erase'方法提供了通过键或删除 通过迭代器。我认为后者比前者更有效率 可能涉及隐式查找操作。另一方面我的调查 在互联网上发现,调用后迭代器可能会变得无效 insert()方法。

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

3 个答案:

答案 0 :(得分:5)

无序容器的重点是尽可能快地查找时间。担心按键擦除元素所花费的时间就像过早优化的经典例子一样。

答案 1 :(得分:2)

如果对你很重要,因为你因为某些其他原因而保留迭代器,那么C ++ 0x会说std::unordered_map(引自FDIS),在23.2.5 / 11中:

  

插入和安置成员不得影响其有效性   迭代器if(N + n)< z * B,其中N是元素的数量   在插入操作之前的容器中,n是元素的数量   插入,B是容器的桶数,z是容器的   最大负载系数。

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

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

答案 2 :(得分:1)

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