map中的元素是一些關鍵字-值對,即鍵值對
set支援搞笑的關鍵字查詢操作,即檢查乙個給定的關鍵字是否在set中。
型別map和multimap定義標頭檔案map中,型別set和multiset定義在標頭檔案set中。無序容器則定義在unordered_map和unordered_set中
按關鍵字有序儲存元素
map 關聯陣列:儲存關鍵字-值對,關鍵字唯一
set 關鍵字即為值,即只儲存關鍵字的容器
multimap 關鍵字可以重複出現的map
multiset 關鍵字可重複出現的set
無序集合
unordered_map 用雜湊函式組織的map
unordered_set 用雜湊函式組織的set
unordered_multimap 雜湊組織的map:關鍵字可以重複出現
unordered_multiset 雜湊組織的set:關鍵字可以重複出現
map型別通常稱為關聯陣列,通過關鍵字來查詢值。稱為關鍵字到值的對映。
set型別就是關鍵字的簡單集合,當只是想知道乙個值是否存在時,set是最好不過的選擇。
使用map
乙個經典的使用map的例子,單詞計數
//統計每個單詞在輸入**現的次數
mapword_count; //表示string型別是關鍵字,size_t型別是值。即string到size_t的對映
string word;
while(cin >> word)
++word_count[word]; //使用前置遞增,因為進入迴圈就已經出現了,所以先增後用
for(const auto &w : word_count)
cout<< w.first << " occurs" << w.second << ((w.second > 1) ? " times" : " time") << endl;
當從map中提取乙個元素時,得到的時乙個pair型別的物件,儲存first和second兩個公有資料成員。
pair型別物件用first儲存關鍵字,用second儲存對應的值
pair型別定義在標頭檔案utility中
使用set與map
對上述例子進行擴充套件,計數時排除一些常用的單詞,the,is等
//統計每個單詞在輸入**現的次數
mapword_count;
setexclude = ;
string word;
while(cin >> word)
//此處判斷使用exclude.find() == exclude.end()
//find函式返回的是乙個迭代器,如果找到,則該迭代器指向該關鍵字,用解引用可以得到值
//如果不存在,find會返回尾後迭代器
pair型別及操作
類似容器,pair是用來生成特定型別的模板。
當建立乙個pair時,我們需要提供兩個型別名,pair的資料成員將具有對應的型別。
pairanon;
pairword_acount;
pair> line;
操作有:
pairp; p是乙個pair,兩個型別t1和t2分別就相應的型別進行了值初始化
pairp(v1, v2); p是乙個pair,使用v1和v2對p的兩個資料成員進行初始化
pairp = ; 與p(v1, v2)一致
make_pair(v1, v2) 返回乙個用v1和v2初始化的pair。pair的兩個型別從v1和v2判斷出來
p1 == p2 當first和second全部相等時,兩個pair相等
p1 != p2
建立pair物件的函式
pairprocess(vector&v)
; //列表初始化
else
return pair(); //隱式構造返回值
}
關聯容器額外的型別別名
key_type 此容器型別的關鍵字型別
value_type 對於set,與key_type相同
set::key_type v2; v2是乙個string型別
map::key_type v3; v3是乙個string型別
map::value_type v5; v5是乙個pair
當我們解引用乙個關聯容器迭代器時,我們的帶乙個value_type值的引用。乙個map的value_type是乙個pair,可以改變pair的值,不能改變關鍵字的值。set的迭代器是const型別的,只能讀取,不能修改。
關聯容器的插入操作
c.insert(v) //v是value_type型別的物件
c.emplace(args) //構造乙個臨時物件,用來插入
c.insert(b, e) b和e是迭代器,指示插入的範圍
c.insert(p, v) p為迭代器,v為value_type型別,插入到p所指位置
c.emplace(p, args)
插入操作的返回值:
pair的first成員是乙個迭代器,指向具有給定關鍵字的元素,second成員是乙個bool值,指出元素是否插入成功
如果關鍵字已在容器中,insert不執行,且返回的bool部分為false。如果關鍵字不再,則元素插入,返回bool為true。
關聯容器的刪除操作:關聯容器定義了三個版本的erase
c.erase(k) 從c中刪除每個關鍵字為k的元素。返回乙個size_type值,指出刪除的元素的數量
c.erase(p) 從c中刪除迭代器p指定的元素。
p必須指向c中乙個真實的元素,不能是c.end()(因為指向尾元素之後,是空的),返回指向p元素後乙個迭代器
c.erase(b, e) 刪除迭代器b和e所表示範圍中的元素,返回e
對於個map使用下標操作時,如果該map中不存在下標關鍵字,那麼會在map中新增進去。使用帶有引數檢查的at操作,如果訪問元素不存在,則會丟擲異常。
關聯容器中訪問元素的一些操作
c.find(k) 返回乙個迭代器,指向第乙個關鍵字為k的元素,若k不再,則返回尾後迭代器
c.count(k) 返回關鍵字等於k的元素的數量,對於不可重複的容器,值為0或1
c.lower_bound(k) 返回乙個迭代器,指向第乙個關鍵字不小於k的元素
c.upper_bound(k) 返回乙個迭代器,指向第乙個關鍵字大於k的元素
c.equal_bound(k) 返回乙個迭代器pair,表示關鍵字等於k的元素的範圍。
若k不存在,則pair的兩個成員均等於c.end()
當我們遍歷乙個multimap或multiset時,保證可以得到序列中所有具有給定關鍵字的元素
lower_bound返回的迭代器可能指向乙個具有給定關鍵字的元素,但也可能不指向
如果關鍵字不在容器中,則lower_bound返回關鍵字的第乙個安全插入點,即不影響容器中元素順序的插入位置
無序容器在儲存上組織為乙個桶,每個桶儲存零個或多個元素。無序容器使用乙個雜湊函式將元素對映到桶。
無序容器管理操作:
c.bucket_count() 正在使用的桶的數目
c.max_bucket_count() 容器能容納的最多桶數目
c.bucket_size(n) 第n個桶中含有多少個元素
c.bucket(k) 關鍵字為k的元素在哪個桶中
桶迭代local_iterator 可以用來訪問桶中元素的迭代器型別
const_local_iterator 桶迭代器的const版本
c.begin(n), c.end(n) 桶n的首元素迭代器和尾後迭代器
c.cbegin(n), c.cend(n) 返回的是const_local_iterator
雜湊策略
c.load_factor() 每個桶的平均元素數量,返回float值
c.max_load_factor() c試圖維持的平均桶大小,返回float值。c會在有需要時新增新的桶
c.rehash(n) 重組儲存。可能改變正在使用的桶的數目
c.reserve(n) 重組儲存,使得c可以儲存n個元素,不會rehash
C 關聯容器 筆記整理
關聯容器中元素是按關鍵字來儲存與訪問的.順序容器中的元素是按它們在容器中的位置來順序儲存與訪問的.關聯容器型別 1.按關鍵字有序儲存元素 map 關聯陣列,儲存 關鍵字 值 對 set 關鍵字即值,只儲存 關鍵字的容器 multimap 關鍵字可重複出現的map multiset 關鍵字可重複出現的...
c dll返回容器 C 學習筆記 關聯容器
目錄 兩個問題 與順序容器一樣,是一種特定型別物件的集合,不同的是,元素是通過關鍵字而不是位置來索引。我們知道c 標準庫中定義了順序容器,順序容器可以提供快速訪問的能力,當我們要在容器內查詢某個關鍵字時,例如我們要在句子中查詢某個單詞以及記錄單詞出現的次數時,使用順序容器就會十分繁瑣。關聯容器支援通...
c 關聯容器,雜湊學習筆記。
9.4 關聯容器 常用的兩個關聯容器set與map 關聯容器 associative container map中是 key value 鍵值對。set 每個元素只包含乙個關鍵字 2.map 關聯陣列,儲存鍵值對 例如 include include include include using na...