繁体   English   中英

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

[英]Efficiently erasing elements in tr1::unordered_map

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM