关联容器
關(guān)聯(lián)容器的類型:?
map:關(guān)聯(lián)數(shù)組;元素通過鍵來從存儲讀取
set:大小可變的集合,至此后通過建實(shí)現(xiàn)快速讀取
multimap:支持同一個鍵多次出現(xiàn)的map類型
multiset:支持同一個鍵多次出現(xiàn)的set類型
一般來說,如果希望有效地存儲不同值的集合,那么使用set比較合適,而map容器則更適用于需要存儲乃至修改每個鍵所干練的值的情況。在做某種文本處理時(shí),可使用set保存要忽略的單詞。而字典是map的一種很好的應(yīng)用,單詞本身是鍵而他的解釋說明則是值,
在開始介紹關(guān)聯(lián)容器之前必須先了解一種魚值相關(guān)的簡單的標(biāo)準(zhǔn)庫類型--pair類型;該類型在utility中定義。
pair的基本操作;
pair<string , string >anon;//
pair<string ,int >word_count;//包含一個空的string和一個空的int
pair<string,vector<int> >line;//包含一個空的string,和一個空vector;
當(dāng)然也可以,在定義是為每個成員提供初始值;
pair<string,string> author("jame","joyce");
此時(shí)author的倆個公有成員first,second,就有了值,author.first="jame",,,,author.second=joce;
還可以這樣:
typedef pair<string ,string > author;
author pro("sfg","sfge");簡化其聲明;
make_pair(v1,v2);//以v1和v2的值創(chuàng)建一個新的pair對象,其元素分別是v1和v2的類型。
[cpp]?view plaincopy
map的構(gòu)造函數(shù):
map<k,v>m;//創(chuàng)建一個名為m的空map對象,其鍵和值的類型分別為k和v
map<k,v>m(m2);//創(chuàng)建m2的副本m,m和m2必須有相同的鍵類型和值類型
map<k,v>m(b,e);//創(chuàng)建map類型的對象m,存儲迭代器b和e標(biāo)記的范圍內(nèi)所有元素的副本,元素的類型必須能轉(zhuǎn)換為pair<const k,v>
對于鍵的類型唯一的約束就是必須支持<操作符,至于是否支持其他的關(guān)系或想等運(yùn)算則不作要求。
map類定義的類型:
map<k,v>::key_type;//map容器中,用作索引的鍵的類型
map<k,v>::mapped_type;//map容器中。鍵所關(guān)聯(lián)的值的類型
map<k,v>::value_type;//一個pair類型,它的first元素具有const map<>::key_type類型,而second元素則為map<>::mapped_type類型;
在學(xué)習(xí)map接口時(shí),需謹(jǐn)記value_type是pair類型,它的值成員可以修改,而建成員不能修改。
1,map迭代器進(jìn)行解引用將產(chǎn)生map的對象。
[cpp]?view plaincopy
2,給map添加元素
定義了map容器后,下一步工作就是在容器中添加鍵值,該項(xiàng)工作可使用insert成員實(shí)現(xiàn),map不支持front,push_front,push_back等操作。
1)使用下標(biāo)訪問map對象:
map<string,int>word;
word["anna"]=1;
此段程序?qū)l(fā)生以下事情:
1.在word中查找鍵位anna的元素,沒有找到
2.講一個姓的鍵值對插入到word中,它的鍵是const string類型的對象,保存anna,而他的值則是采用直初始化,就意味著本例中的值為0
3.將這個新的鍵值對插入到word中
4.讀取新插入的元素并將它的值賦為1;
使用下標(biāo)訪問不存在的元素將導(dǎo)致在map容器中添加一個新的元素,它的鍵即為下標(biāo)值。
[cpp]?view plaincopy
2)下標(biāo)行為的編程意義
對于map容器如果下標(biāo)所表示的鍵在容器中不存在則添加新元素,這一特征可使程序驚人的簡練;
[cpp]?view plaincopy
? ?其中最有趣的是,在單詞第一次出現(xiàn)時(shí),會在word中創(chuàng)建并插入一個以該單詞為索引的新單詞,同時(shí)將它的值初始化為0;然后立即加1;所以每次在map中添加新元素時(shí),搜統(tǒng)計(jì)的出現(xiàn)次數(shù)正好為1;
map::insert的使用:
word.insert(map<string,int>::value_type("Anna",1));
可用兩種方法簡化:
word.insert(make_pair("anna",1));
或:typedef map<string,int>::value_tye valType;
word.insert(valType("anna",1));
map對象中一個給定鍵值對應(yīng)一個元素,如果試圖插入的元素對應(yīng)的鍵已經(jīng)在容器中,則insert將不做任何操作。
insert返回值為包含一個迭代器和一個bool值的pair對象。
map<string,int >mp;
pair<map<string,int>::iterator,bool>ret=mp.insert(word,1);
使用下標(biāo)存在一個很危險(xiǎn)的副作用:如果該鍵不在map容器中那么下標(biāo)操作會插入一個具有該鍵的新元素。有時(shí)著東西很有用但有時(shí)卻帶來危險(xiǎn)
例如若是我們只想知道某元素是否存在。。。。
map容器提供倆個操作,count和find,用于檢查某個鍵是否存在而不會插入該鍵;
m.count(k);//返回m中k出現(xiàn)的次數(shù)。
m.find(k);//如果m容器中存在k索引的元素,則返回只想該元素的迭代器,如果不存在,則返回超出末端迭代器。
從map中刪除元素
map.erase(k);//刪除m中鍵為k的元素,返回size_type類型的值。表示刪除的元素個數(shù)
map.erase(p);//從m中刪除迭代器p所指向的元素,p必須指向m中確實(shí)存在的元素,而且不能等于m.end;返回void
map.erase(b,e);//從m中刪除一段范圍內(nèi)的元素該范圍有迭代器對b和e標(biāo)記,返回void
map同樣提供begin和end運(yùn)算。
總結(jié)
- 上一篇: string实现
- 下一篇: Contains Duplicate I