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