關聯容器支持通過鍵來高效地查找和讀取元素,放入關聯容器中的元素,按照鍵的大小來排列,c++標準庫支持兩個基本的關聯容器類型:map和set。map是鍵-值對的集合,通常可以理解爲關聯數組,使用map對象時,必須包含map頭文件。set是單純的鍵的集合,它支持map大部分操作,使用set容器時,必須包含set頭文件。關聯容器的類型包括map、set、multimap、multiset。
pair類型:定義在utility頭文件中,是由兩個元素組成的數據結構,通常可以用在map容器中
pair<T1, T2> p1; //創建一個空的pair對象
pair<T1, T2> p1(v1, v2); //創建一個pair對象,兩個元素的值爲v1, v2
make_pair(v1, v2); //以v1, v2生成一個新的pair對象
p1 < p2、p1 == p2
p.first、p.second //返回first、second共有的數據成員
map類型
定義:
map<k, v> m;
map<k, v> m(m2);
map<k, v> m(b, e);
注:鍵類型的約束,鍵不但要有一個類型,而且還有一個相關的比較函數,默認情況下,標
準庫使用鍵類型數據上的“小於”關係。
map定義的類型:
map<k, v>::key_type //索引的鍵的類型
map<k, v>::mapped_type //鍵所關聯的值的類型
map<k, v>::value_type //一個pair類型,與make_pair有相同的作用
添加元素:
使用insert成員實現
m.insert(e); //返回一個pair對象
m.insert(beg, end);
m.insert(iter, e);
使用下標操作符獲取元素,然後給獲取元素賦值 //下標操作符返回左值,如果下標所
表示的鍵不在容器中,則添加新元素
查找元素:
當使用下標操作符查找不到元素時,map會自動添加該元素,所以我們不能用下標操作符進
行查找,c++標準庫提供了count和find兩個函數進行查找,對於map對象,count成員的返回
值只能是0或1,而find的返回值是一個迭代器。
m.count(k);
m.find(k); //如果找不到則返回m.end()
刪除元素:
m.erase(k); //返回刪除元素個數
m.erase(p); //返回void
m.erase(b, e); //返回void
迭代遍歷: //與順序容器相同
multimap:
mutimap允許一個鍵對應多個實例,所以multimap不支持下標運算,它的使用方法與map基本相同,使
用時需要引用map頭文件。
不同的迭代方案:
m.lower_bound(k); //返回迭代器,指向鍵不小於K的第一個元素
m.upper_bound(k); //返回迭代器,指向鍵不大於K的第一個元素
m.equal_range(k); //返回迭代器的pair對象,它的first成員等價與
m.lower_bound(k)
set類型
set容器是單純的鍵的集合,它支持大部分的map操作,set不支持下標操作符,而且沒有定義
mapped_type類型,在set容器中,value_type與key_type類型相同,並且鍵爲const類型,不可
以修改,如果某個集合需要按順序存儲,並且要保證不重複出現任何元素,可以考慮使用此類型。
添加元素:
s.insert(k);
s.insert(beg, end); //返回pair類型,包含一個迭代器和一個bool類型,bool
代表是否添加了元素
其他操作: //同map
multiset:
multiset允許一個鍵對應多個實例,它的使用方法與set基本相同,使用時需要引用set頭文件