簡體   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