11.考虑用排序的vector替代关联容器
當想到排序時,第一個想到的是關聯容器set、muliset、map、multimap, 它們的底層實現為紅黑樹,查找的時間復雜度為O(log(n))。也可以使用哈希容器unordered_set、unorderd_multiset、unordered_map、unordered_multimap,它們的底層實現為哈希表,查找的時間復雜度為常數時間復雜度。
關聯容器使用的紅黑樹,優化了插入、查找、刪除等操作,使它們均為對數時間復雜度。所以對于各種情況下的操作,它的查找性能都會比較穩定。
但是,對于容器,如果對其進行的操作固定,例如明顯分為三個階段:
設置階段:創建一個新的數據結構,并插入大量元素。在這個階段,幾乎所有操作都是插入或者刪除操作,很少或幾乎沒有查找操作。
查找階段:查詢該數據結構以找到特定的信息。在這個階段,幾乎所有操作都是查找操作,很少或幾乎沒有插入或者刪除操作。
重組階段: 改變該數據結構的內容,或許是刪除所有的當前數據,再插入新的數據。
這種情況下使用vector作為容器來存儲std::pair可能查找效果會更好。當然,前提時,先要對vector容器進行排序。
這是因為,排序的vector容器和關聯容器,查找都是使用二分查找法。但是由于關聯容器底層的紅黑樹,除了保存原始數據本身外,至少還包括2個指針,一個指向前驅、一個指向后繼。因此,同樣大小的內存,存放的vector數據要比關聯容器多,查找的效率就相對較高。
當然,如果對于容器的操作無法預測,例如插入、查找、刪除交替進行。使用vector將面臨大量的內存分配、對象移動等,這將消耗大量的時間,無疑是非常不可取的。因此,選用什么樣的容器,必須結合自身的需求。沒有哪個容器是放置四海而皆準的。
?
總結
以上是生活随笔為你收集整理的11.考虑用排序的vector替代关联容器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 9.为包含指针的关联容器指定比较类型
- 下一篇: 12.当效率至关重要时,请在map::o