c 筆記 關聯容器

2021-09-11 20:25:46 字數 4236 閱讀 9172

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...