概述
stl定義了另一種容器,名曰關聯容器,關聯容器和順序容器的本質區別在於:關聯容器通過鍵key來儲存和讀取元素,而順序容器則通過元素在容器中的位置順序儲存和訪問元素。關聯容器的大部分行為與順序容器相同,但其獨特之處在於支援鍵的使用。
stl提供了兩個基本的關聯容器
1、map:容器中以鍵值的形式來組織資料。鍵key代表了資料在容器中的索引,而值則是表示所儲存和讀取的資料。
2、set:僅包含乙個鍵,一般用於查詢某個鍵是否存在。
舉個例子:
字典是map的典型應用,字典中的字就是鍵,而字對應的內容解釋就是值。
在某些文書處理中,set用作關鍵字的集合,程式決定這些關鍵字是否遮蔽。
set和map所包含的元素都具有不同的鍵,換句話說,乙個相同的鍵不能在容器內出現兩次(乙個鍵無法對應多個值)。為了解決這個問題,標準庫引入了multimap和multiset型別,這兩種容器允許多個元素擁有相同的鍵。
舉個例子:
在**本的應用中,乙個人名(鍵)可能對應多個號碼(值),這時選用multimap較為合適。
pair型別
在討論關聯容器前,必須先引入乙個與之關係密切的stl型別,pair型別。
pair型別是單個的鍵值對,說明白點,map中的單個元素就是乙個pair型別元素,通過map迭代器進行解引用,得到的就是pair型別物件。
pair定義在utility標頭檔案中。
pair型別提供的操作有:
1、pairp1:建立乙個空的pair物件,它的兩個元素型別分別為t1,t2,採用值初始化(如string則初始化為"").
2、pairp1(v1,v2):建立乙個pair物件,它的兩個元素型別分別為t1,t2,其中第乙個成員初始化為v1,第二個成員初始化為v2.
3、make_pair(v1,v2):以v1和v2的值建立乙個新的pair物件,起元素型別分別為v1和v2的型別.
4、p15、p1==p2:如果兩個pair物件的first和second元素依次相等,則返回真。該運算使用其元素的==運算(也就是元素型別必須提供==操作).
6、p.first:返回p中第乙個的資料成員。
7、p.second:返回p中第二個資料成員。
技巧:pair型別的使用比較繁瑣,因此,如果需要定義多個相同的pair型別,可以使用以下形式
typedef pairname;
name shen("haha","hehe");
name wang("hoho","xixi");
map容器
在使用map前,必須包含map的標頭檔案。
在定義map的時候,必須指明map的鍵值型別。
如:mapphone_book;//鍵為string型別,值為string型別
建構函式:
1、mapm:建立乙個名為m的空map,鍵值型別分別為k和v。
2、mapm(m2):建立m2的副本m,m與m2必須有相同的鍵型別和值型別。
3、mapm(b,e):建立map型別的物件m,儲存迭代器b和e標記範圍內所有元素的副本(左閉合區間),元素型別必須能轉換為pair。
注意:使用關聯容器時,鍵的型別必須要有《操作符(比較操作符中的小於)。因為在向關聯容器中增加元素時,是按照嚴格弱排序來排列的,即小的在大的前面,所以要實現這種排序,必須定義《操作符。
定義的型別:
map::key_type:在map容器中,用作索引的鍵的型別。
注意:對map迭代器進行解引用時,得到的是乙個pair物件。那麼,完全可以對map迭代器做->操作,這樣比較簡潔,看下面的例子:
mapii_map;
...//插入元素
map::iterator ii_iter=ii_map.begin();
cout cout <<(*ii_iter).first;
map的操作
新增元素:
最常規的方法就是和順序容器一樣,使用map::insert成員函式插入元素。有以下三個版本:
1、m.insert(e):e是乙個value_type型別(pair)。如果e.first不在m中,則插入乙個值為e.second的新元素。反之,則保持m不變。
注意:該函式返回乙個pair型別物件,這個物件的first是指向鍵為e.first的元素的map迭代器,second是乙個bool型別的物件,表示是否插入了該元素。
2、m.insert(beg,end):beg和end是標誌著元素範圍的迭代器(左閉合區間)。迭代器指向的元素,必須為value_type型別。對於範圍內的所有元素,如果它的鍵在m中不存在,則將該鍵及其關聯的值插入到m中。返回void。
3、m.insert(iter,e):e是待插入的元素,型別必須為value_type(pair)。如果e.first不在m中,則建立新元素,並以迭代器iter為起點搜尋新元素儲存的位置。返回乙個迭代器,指向鍵為e.first的元素。
除了以上三種成員函式,還可以使用下標來實現新增元素。考慮以下的例子:
mapsi_map;
si_map["haha"]=1;
以上示例執行了這些操作:
1、在si_map中搜尋鍵為haha的元素,沒找到。
2、將乙個新的鍵值對插入si_map中,其中鍵位const string型別物件,儲存了haha.值為int的初始化值,為0。
3、讀取新插入的元素,並將它的值賦為1。
4、如果si_map中已經有haha這個鍵了,則將haha對應的值設定為1。
可見,map的下標即是元素的鍵。使用下標進行賦值時,如map中不存在給定的鍵,則新增這個鍵值。
查詢操作
提供兩個函式
1、m.count(k):返回m中鍵為k的元素出現的次數(對於map來說,只可能是0或1)
2、m.find(k):搜尋m中鍵為k的元素,如搜尋到,則返回指向這個元素的迭代器。否則,返回超出末端的迭代器。
刪除元素
1、m.erase(k):刪除m中鍵為k的元素。返回size_type型別的值,表示刪除的元素個數。(對於map來說,只可能是0或者1)
2、m.erase(p):從m中刪除迭代器p所指向的值。p必須指向m中確實存在的元素,當然不能等於m.end()。返回void。
3、m.erase(b,e):從m中刪除一段範圍內的元素(左閉合區間)。b和e必須標記m中的一段有效範圍。b和e要麼相等(刪除範圍為空),要麼b所指的元素必須在e所指的元素之前。返回void。
stl之關聯容器學習筆記2
set型別容器 set容器只是單純的鍵的集合,其中的鍵必須唯一,且不能修改 const 舉個例子 某軟體提供黑名單功能,其黑名單就可用set容器配置。在做某項操作前,先檢查黑名單。2 set中,value type不是pair型別,而是與key type相同的型別。因為只是單純的鍵集合,沒有關聯的值...
STL學習筆記 關聯容器
stl中常用的關聯容器有四種 set map mutimap multiset。這四種容器中的元素都是按照鍵有序排列的,因此關聯容器的鍵值必須是可比較的。如果鍵值是基本型別可以直接使用,如果鍵值是自定義型別,需要定義帶有比較謂詞的建構函式map中儲存著一系列的鍵值對兒,每個鍵對應乙個值,鍵類似有索引...
STL之關聯容器
1.set單重集合 不允許key重複 set作為乙個容器,也是用來儲存同一資料型別的資料型別,並且能從乙個資料集合中取出資料 c stl中標準關聯容器set,multiset,map,multimap內部採用的就是一種非常高效的平衡檢索二叉樹 紅黑樹 include using namespace ...