map/set/multi_map/multi_set/unorder_map/unorder_set总结
map/set/multi_map/multi_sep底層實現是加頭節點的紅黑樹,元素之間有序,當存放的是自定義類型的時候要重載operator<,中序遍歷的時候是有序的。增刪查的時間復雜度都是O(lgN)
map存放的是鍵值對<key,value>,,key唯一,value可以重復,不能修改key的值,可以先刪除舊的值,再添加新的值,value的值可以修改。
set用戶存放的是值,但是底層存放的仍能存放的是鍵值對,只不過key=value,同樣的值是唯一的,不能隨便修改value.
mulit_map/multi_set與map/set相比,大部分都是相同的,只是存放的元素可以不唯一,可以重復。
set/multiset不區分鍵值和實值,其鍵值就是實值,會根據待定的排序準則,自動將元素排序。兩者唯一的不同在于前者不允許元素重復(底層調rb_tree::insert_unique()),而后者允許(底層調用rb_tree::insert_equal())。?
和set相比,map/multimap同時擁有實值(value)和鍵值(key),其每一個元素都是pair<key,value>,pair的第一個元素是鍵值,第二個元素是實值。map和multimap的唯一區別在于,map不允許兩個元素擁有相同的鍵值(底層調rb_tree::insert_unique()),而multimap允許存在重復的鍵值(底層調用rb_tree::insert_equal())。
unordered_map/unordered_set底層實現用了哈希表,
(1)unordered_set存放的是value,unorder_map也是存儲的key-value的值,可以通過key快速索引到value,但是不會根據key的大小進行排序,增刪查的時間復雜度都是O(1)
(2)同樣不能修改key值當存放的是自定義的元素類型的時候,需要定義hash_value函數并且重載operator==,重載operator==是因為,如果兩個元素的通過哈希函數計算出的值相同,并不能斷定這兩個元素就相同,必須再調用operator==。
(3)散列值相同的被存儲在一個桶里。當散列容器中有大量數據時,同一個桶里的數據也會增多,造成訪問沖突,降低性能。為了提高散列容器的性能,unordered庫會在插入元素是自動增加桶的數量,不需要用戶指定。但是,用戶也可以在構造函數或者rehash()函數中,指定最小的桶的數量
unordered_map/unordered_set ?與map/set結論:
運行效率方面:unordered_map/unordered_set?最高,而map/set效率較低但 提供了穩定效率和有序的序列。
占用內存方面:map/set內存占用略低,unordered_map/unordered_set內存占用略高,而且是線性成比例的。
總結
以上是生活随笔為你收集整理的map/set/multi_map/multi_set/unorder_map/unorder_set总结的全部內容,希望文章能夠幫你解決所遇到的問題。