map和set的原理


1)map:經過排序了的二元組的集合,map中的每個元素都是由兩個值組成,其中的key(鍵值,一個map中的鍵值必須是唯一的) 是在排序或搜索時使用,它的值可以在容器中重新獲取;而另一個值是該元素關聯的數值。比如,除了可以ar[43] = "overripe"這樣找到一個數據,map還可以通過ar["banana"] = "overripe"這樣的方法找到一個數據。如果你想獲得其中的元素信息,通過輸入元素的全名就可以輕松實現

2)set:包含了經過排序了的數據,這些數據的值(value)必須是唯一

3)map和set的基本原理:紅黑樹

4)額外問題:

# 為何map和set的插入刪除效率比用其他序列容器高?因為對於關聯容器來說,不需要做內存拷貝和內存移動。說對了,確實如此。map和set容器內所有元素都是以節點的方式來存儲,其節點結構和鏈表差不多,指向父節點和子節點。插入和刪除就是指針換來換去,和內存移動沒有關系

# 為何每次insert之后,以前保存的iterator不會失效?iterator這里就相當於指向節點的指針,內存沒有變,指向內存的指針怎么會失效呢(當然被刪除的那個元素本身已經失效了)。相對與vector來說,vector每次插入和刪除,指針都有可能會失效,比如:當該內存塊不夠它擴容時,它會申請其它內存塊,此時指針會失效!

# 當數據元素增多時(10000到20000個比較),map和set的插入和搜索速度變化如何?STL的優勢並不在於算法,而在於內存碎片。如果你需要經常自己去new一些節點,當節點特別多,而且進行頻繁的刪除和插入的時候,內存碎片就會存在,而STL采用自己的Allocator分配內存,以內存池的方式來管理這些內存,會大大減少內存碎片,從而會提升系統的整體性能。當時間運行很長時間后(例如后台服務程序),map的優勢就會體現出來。從另外一個方面講,使用map會大大降低你的編碼難度,同時增加程序的可讀性。學習STL map, STL set之數據結構基礎看來是很有必要的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM