C++拾趣——STL容器的插入、刪除、遍歷和查詢操作效能對比(ubuntu g++)——遍歷和查詢
遍歷
從前往後
元素個數>15000
表現最差的是unordered_multiset。其在遍歷到1000個左右的元素時發生較高的延時操作,然後又穩定下來。
除了這個容器,再看下其他容器的表現。
可以看出這些容器的遍歷效率差距不大。最快的vector比倒數第二慢的unorderedset快50%左右。
vector容器在元素個數大於8000左右開始,效率優於list。之前list是最優的。
元素個數<4096
因為unordered_multiset效率還是很差,所以上圖例沒有將其列出。
deque在最開始時,發了高耗時的操作。之後它的效率還是可以的。
元素個數<1024
unordered_multiset在元素個數超過200左右時,效率將差於其他容器。
deque在元素個數低於200左右時,效率低於所有容器。
結果對比:
元素個數大於8000左右時,vector效率是最好的。
元素個數小於8000左右時,list效率是最好的。
元素個數大於200左右時,unordered_multiset效率是最差的。
元素個數小於200左右時,deque效率是最差的。主要原因是開始時一次高耗時操作,但是之後每次操作耗時均不多(線的變化率)。
從後往前
支援從後向前遍歷的容器並不多,只有:vector、deque、list、set、map、multiset和multimap。
元素個數>15000
vector效率最高,其次是deque和list。
結論:
vector在各個方向的遍歷效率均比較優秀。
list在從前往後遍歷時比deque優秀。
deque在從後向前遍歷時比list優秀。
關聯容器的遍歷效率沒有非關聯容器高。
查詢
因為非關聯容器的查詢只能通過遍歷,其效率和關聯容器的查詢沒法比。所以我們只比較關聯容器
元素個數>15000
最優的是unordered_multiset,其次是unordered_map和unordered_set。
最差的是set。
元素個數<1024
元素個數小於600左右時,unordered_multimap是最差的。
元素個數大於600左右時,set是最差的。
結果對比:
unordered_multiset的效率一直是最好的。
set在元素較多時效率是最差的,其他時候也很差。
結論:
unordered系列容器比ordered系列容器效率高。
ordered系列容器中,map系列比set系列對應的容器效率高。比如map比set優,multimap比multiset優。
set效率最差。
unordered_multiset最優。