map的操作參考文章《c++ primer 學習筆記_35_stl實踐與分析(9)--map型別(上)
》《c++ primer 學習筆記_36_stl實踐與分析(10)--map型別(下)
》map的特性:所有元素會按照元素的鍵值自動排序。map所有元素都是pair,第乙個元素視為鍵值,第二個元素視為實值;map不允許兩個元素擁有相同的鍵值。
可以修改元素的實值,但是不能修改元素的鍵值(鍵值是const型別的),因此map的迭代器既不是constant iterators,也不是mutale iterators。
set的操作參考文章《c++ primer 學習筆記_37_stl實踐與分析(11)--set型別
》set是stl中的標準容器,set裡面的元素會根據鍵值自動排序,它不像map那樣擁有實值value和鍵值key的對應,set只有實值。set的底層實現是rb-tree,當插入到rb-tree中後,其值不能再更改,因為更改就意味著可能不符合rb-tree的特性了,所以其迭代器set::iterator是rb-tree的constrant iterator。由於set底層是rb-tree,所以set在插入等操作之後,迭代器不會失效,但刪除元素的迭代器是個例外。
當只想知道乙個值是否存在時,使用set容器最合適。因為set是自動排序的,不會存在相同的元素,因此可以很輕易判斷某個元素是否存在於set中。例如可以輕鬆找到某個人名是否存在於列表:
string name;
setsset;
cin >> name;
if (set.count(name))
cout << "找到了" << endl;
上述**輸入乙個name,通過set的count函式判斷name是否存在於set中。若存在count返回1,否則返回0.
map與vector的區別:
(1)用下標訪問map中並不存在的元素會導致在map容器中新增該元素,該元素鍵即為該下標值。能作為map下標的型別必須是定義了「小於」操作符的型別,因為鍵值在標準庫中預設是通過小於操作比較的。
(2)當對元素進行插入或刪除操作時,操作之前的所有迭代器,在操作完成後依然有效;當然被刪除那個元素的迭代器是例外。(set與map類似)。這是由於其內部結構決定的。map和set的底層容器是rb-tree,是指標之間連線元素的,因此插入刪除不會導致迭代器失效。
但是vector(包括deque)的插入或刪除操作卻可能是部分或全部迭代器失效。這同樣是由其底層實現機制決定的,因為vector和list插入或刪除都會重新分配空間,這樣迭代器肯定會失效。關於vector以及deque的空間分配方法參考文章《stl原始碼:vector
》《stl原始碼:deque
》。map與set的區別以及適用範圍
相同點:都儲存鍵值。
都要保證鍵值的唯一性,而且不能修改。
都支援建構函式、insert、erase和count、find等操作。
set純粹是鍵的集合,而map是pair的集合。
map適合用於需要了解鍵值與值之間對應關係的情況,例如,字典,要了解單詞(鍵)與其解釋(值)之間對應關係的情況;set適用於僅需判斷某值是否存在的情況,例如判斷某人姓名是否在名單中。
set與list的區別
乙個相同點:當對元素進行插入或刪除操作時,操作之前的所有迭代器,在操作完成後依然有效;當然被刪除那個元素的迭代器是例外。(map和set類似)
主要差別:set的元素不能修改,list無此限制。
set適用於儲存元素值不變的集合,list適用於儲存會發生變化的元素。
JQuery 書籍與其原始碼
learning jquery 1.3最新版 div.horizontal eq 1 nth child index even odd equation 匹配其父元素下的第n個子或奇偶元素 first child first 只匹配乙個元素,而此選擇符將為每個父元素匹配乙個子元素 odd 匹配所有索...
STL 原始碼閱讀
1 這裡可以看出來,容器將迭代器作為類成員。vectora iteratorite a.begin 容器的成員函式可以返回迭代器,所以迭代器是容器的成員物件。2 個人理解,迭代器是對指標的封裝和提公升,盡可能遮蔽資料結構的底層細節,對外提供統一的操作介面,這些介面跟普通指標的功能類似,比如自增或自減...
STL原始碼簡述
stl是standard template library的簡稱,中文名標準模板庫,惠普實驗室開發的一系列軟體的統稱。從根本上說,stl是一些 容器 的集合,這些 容器 有list,vector,set,map等,stl也是演算法和其他一些元件的集合。這裡的 容器 和演算法的集合指的是世界上很多聰明...