筆記4 (關聯容器)

2021-06-19 12:01:14 字數 2870 閱讀 1537

關聯容器

關聯容器和順序容器的本質差別在於:關聯容器通過鍵(key)儲存和讀取元素,而順序容器則通過元素在容器中的位置順序儲存和訪問元素。

關聯容器(associativecontainer)的元素按鍵排序和訪問,支援通過鍵來高效地查詢和讀取元素。

map的元素以鍵—值(key-value)對的形式組織:鍵用作元素在map中的索引,而值則表示所儲存和讀取的資料。

set僅包含乙個鍵,並有效地支援關於某個鍵是否存在的查詢。

map關聯陣列:元素通過鍵來儲存和讀取

set大小可變的集合,支援通過鍵實現的快速讀取

multimap

支援同乙個鍵多次出現的 map 型別

multiset

支援同乙個鍵多次出現的 set 型別

pair型別

#include

pairp1;

建立乙個空的 pair 物件,它的兩個元素分別是 t1 和 t2 型別,採用值初始化

pairp1(v1, v2);

建立乙個 pair 物件,它的兩個元素分別是 t1 和 t2 ,其中 first 成員初始化為 v1,而 second 成員初始化為 v2

make_pair(v1, v2)

以 v1 和 v2 值建立乙個新 pair 物件,其元素型別分別是 v1 和 v2 的型別

p1 < p2

兩個 pair 物件之間的小於運算,其定義遵循字典次序:如果 p1.first < p2.first 或者 !(p2.first < p1.first) && p1.second < p2.second,則返回 true

p1 == p2

如果兩個 pair 物件的 first 和 second 成員依次相等,則這兩個物件相等。該運算使用其元素的 == 操作符

p.first

返回 p 中名為 first 的(公有)資料成員

p.second

返回 p 的名為 second 的(公有)資料成員

pair物件的操作

對於pair類,可以直接訪問其資料成員:其成員者都是公有的,分別命名為first和second。

關聯容器

根據鍵排列元素:在迭代遍歷關聯容器時,我們可確保按鍵的順序訪問元素,而與元素在容器中的存放位置完全無關。

map型別

關聯本質在於元素的值與某個特定的鍵相關聯,而並非通過元素在陣列中的位置來獲取。

map的定義

mapm;

建立乙個名為 m 的空 map 物件,其鍵和值的型別分別為 k 和 v

mapm(m2);

建立 m2 的副本 m,m 與 m2 必須有相同的鍵型別和值型別

mapm(b, e);

建立 map 型別的物件 m,儲存迭代器 b 和 e 標記的範圍內所有元素的副本。元素的型別必須能轉換為 pair

鍵型別的約束

鍵型別必須定義< 操作符,而且該操作符應能「正確地工作」。

map定義的型別

map::key_type

在 map 容器中,用做索引的鍵的型別

在 map 容器中,鍵所關聯的值的型別

map::value_type

對迭代器進行解引用時,將獲得乙個引用,指向容器中乙個value_type型別的值。

給map新增元素

使用下標訪問map物件

下標操作符返回該鍵所關聯的值(下標操作符返回的型別與迭代器的解引用返回型別不同,這點與vector和string型別不同)。

map::insert的使用

m.insert(e)

e 是乙個用在 m 上的 value_type 型別的值。如果鍵(e.first)不在 m 中,則插入乙個值為 e.second 的新元素;如果該鍵在 m 中已存在,則保持 m 不變。該函式返回乙個 pair 型別物件,包含指向鍵為 e.first 的元素的 map 迭代器,以及乙個 bool 型別的物件,表示是否插入了該元素

m.insert(beg, end)

beg 和 end 是標記元素範圍的迭代器,其中的元素必須為 m.value_type 型別的鍵-值對。對於該範圍內的所有元素,如果它的鍵在 m 中不存在,則將該鍵及其關聯的值插入到 m。返回 void 型別

m.insert(iter, e)

e 是乙個用在 m 上的 value_type 型別的值。如果鍵(e.first)不在 m 中,則建立新元素,並以迭代器 iter 為起點搜尋新元素儲存的位置。返回乙個迭代器,指向 m 中具有給定鍵的元素

查詢並讀取map中的元素

m.count(k)

返回 m 中 k 的出現次數

m.find(k)

如果 m 容器中存在按 k 索引的元素,則返回指向該元素的迭代器。如果不存在,則返回超出末端迭代器

count適合用於解決判斷map容器中某鍵是否存在的問題,而find適合用於解決在map容器中查詢指定鍵對應的元素的問題。

set型別

set容器只是單純的鍵的集合。

#include

multimap和multiset型別

multimap和multiset型別允許乙個鍵對應多個例項。

在multimap中,同乙個鍵所關聯的元素必然相信存放。

m.lower_bound(k)

返回乙個迭代器,指向鍵不小於 k 的第乙個元素

m.upper_bound(k)

返回乙個迭代器,指向鍵大於 k 的第乙個元素

m.equal_range(k)

返回乙個迭代器的 pair 物件

它的 first 成員等價於 m.lower_bound(k)。而 second 成員則等價於 m.upper_bound(k)

C Primer 筆記 關聯容器

關聯容器 associative container 支援通過鍵來高效的查詢和讀取元素。map 關聯陣列,元素通過鍵來儲存和讀取 set 大小可變的集合,支援通過鍵來快速讀取 multimap 支援同乙個鍵出現多次的map型別 multiset 支援同乙個鍵多次出現的set型別 pairp1 建立乙...

c 筆記 關聯容器

map中的元素是一些關鍵字 值對,即鍵值對 set支援搞笑的關鍵字查詢操作,即檢查乙個給定的關鍵字是否在set中。型別map和multimap定義標頭檔案map中,型別set和multiset定義在標頭檔案set中。無序容器則定義在unordered map和unordered set中 按關鍵字有...

《C Primer》學習筆記 關聯容器

一,pair型別 pairp1 建立乙個空pair指標,兩個元素分別是t1,t2型別,採用值初始化 pairp1 v1,v2 first成員初始化為v1,second成員為v2 make pair v1,v2 建立新的pair物件 p1 p2 p1 p2 p.first 返回first成員 p.se...