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

2021-05-25 04:44:39 字數 4334 閱讀 9664

一,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.second

返回second

可以再定義時初始化;

pair型別的使用相當繁瑣,因此用typedef來簡化其宣告和使用;

兩個成員都是公有的;

pairnext_auth;

string first, last;

while(cin >> first >> last)

二,關聯容器

1,如果希望有效地儲存不同值的集合,使用set;map更適用於需要儲存和修改每個鍵所關聯的值的情況。

三,map型別

1,本質在於元素的值與某個特定的鍵相關聯,而非通過所在位置來獲取,每個鍵只出現一次。

2,必須包含map標頭檔案。 3,

map的宣告和初始化

mapm;

建立乙個空map物件

mapm(m2);

必須具有相同的鍵型別和值型別

mapm(b, e);

儲存b和e之間的所有副本。元素的型別必須能轉換為pair

4,map定義的型別

map::key_type

鍵型別,鍵為const

map::mepped_type

值型別map::value_type

pair型別,first為鍵型別,second為值型別

map迭代器進行解引用將產生pair型別的物件;

5,鍵型別的約束:

鍵不但有乙個型別,而且還有乙個相關的比較函式,即< 操作符:滿足與自身比較導致false,傳遞性,不能互相小於,互相不存在「小於」即為相等。

6,用下標訪問map

如果不存在,則新增乙個鍵為下標值的新元素;

下表操作符返回左值;

7,map::insert的使用

m.insert(e)

e為value_type型別;

如果e.first不存在,則插入;若存在,則保持不變;

返回乙個pair型別物件,包含指向鍵為e.first的元素的迭代器,和乙個bool型別的物件,表示是否插入,即pair::iterator, bool>型別。

m.insert(beg, end)

beg和end中間的元素為m.value_type型別;

對所有的元素,只要該鍵不存在,則插入;

返回void。

m.insert(iter, e)

e為m.value_type;

不存在,則建立,以iter為起點搜尋新元素儲存的位置;

返回迭代器指向有給定鍵的元素;

傳遞給insert的實參太繁瑣,兩種方法改進:一是用make_pair(k, v),二是用typedef。

8,查詢並讀取map中的元素

如果只想查詢或者讀取元素而不想新建元素怎麼辦?

m.count(k)

返回m中k的出現次數

m.find(k)

存在k索引的元素,返回指向該元素的迭代器;

不存在,則返回超出末端迭代器end。

if (m.count(「key」))

value = m[「key」]; 

以上實現了讀取但不插入,但實際上做了兩次查詢。

map::iterator it = m.find(「key」);

if (it != m.end())

value = it->second;

以上只進行了一次查詢。

9,從map物件中刪除元素

m.erase(k)

返回size_type型別,表示刪除的元素個數

m.erase(p)

刪除迭代器p指向的元素;

p必須指向存在的元素,不能為end;

返回void

m.erase(b, e)

b和e必須標記m中一段有效返回:e可以指向end;

b和e可以相等(刪除範圍為空),否則b要在e之前;

返回void

10,           

map物件的迭代遍歷

map::const_iterator map_it = word_count.begin();

while (map_it != word_count.end())

四,set型別

1,set是單純鍵的集合,每個鍵只出現一次,即對同一鍵多次插入實際只插入一次。

2,必須包含set標頭檔案。 3,

4,給set新增元素

s.insert(k)

如果e.first不存在,則插入;若存在,則保持不變;

返回乙個pair型別物件,包含指向鍵為k的元素的迭代器,和乙個bool型別的物件,表示是否插入

s.insert(beg, end)

beg和end中間的元素為s.value_type型別;

對所有的元素,只要該鍵不存在,則插入;

返回void。

5,獲取set元素

因為沒有下表操作,所以獲取元素只能用find運算;如果只需判斷是否存在,則用count運算。

set的鍵也為const,所以只能做讀操作,不能做寫操作。

五,multimapmultiset型別

1,允許乙個鍵對應多個值,因此與map和set的操作有所不同。 2,

multimap和multiset的操作分別與map和set的操作相同,只有乙個例外:multimap不支援下標運算,因為乙個鍵可能對應多個值。

但由於乙個鍵可以對應多個值,因此各個操作都以不同的方式做出了修改,可以處理多個值。

3,元素的新增和刪除

每次呼叫insert都會新增乙個元素,無論該鍵是否存在;

帶有乙個鍵引數的erase將刪除所有元素,並返回元素個數;

帶有乙個或一對迭代器引數的版本只刪除指定的元素,並返回void型別;

4,查詢元素 a,

map和set中的元素是按順序儲存的;multimap和multiset中對應同乙個鍵的元素將相鄰存放。

b,使用find和count操作

typedef multimap::size_type sz_type;

sz_type entries = multimap.count(k);

multimap::iterator iter = multimap.find(k);

for (sz_type cnt = 0; cnt != endl; ++cnt, ++iter)

c, 面向迭代器的解決方案

m.lower_bound(k)

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

m.upper_bound(k)

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

適用於map和set但更常用於multimap和multiset;

呼叫這兩個函式將產生乙個迭代器範圍,指示出所關聯的所有元素;

如果該鍵不存在,則返回指向該鍵應該插入的位置的迭代器;

返回值有可能是超出末端迭代器;

typedef multimap::iterator iter;

iter beg = m.lower_bound(k),

end = m.upper_bound(k);

while (beg != end)

d,equal_range函式

m.equal_range(k)

返回乙個迭代器的pair物件:

first成員等價於m.lower_bound(k);

second物件等價於m.upper_bound(k)。

pairpos = m.equal_range(k);

while(pos.first != pos.second)

C Primer 筆記 關聯容器

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

C Primer學習筆記 10 關聯容器

題記 本系列學習筆記 c primer學習筆記 主要目的是討論一些容易被大家忽略或者容易形成錯誤認識的內容。只適合於有了一定的c 基礎的讀者 至少學完一本c 教程 本文主要討論c 標準庫中的關聯容器 associative container 內容主要涉及map,set,multimap和multi...

c primer 學習筆記18 關聯容器

關聯容器和順序容器的本質差別在於 關聯容器通過鍵 key 儲存和讀取元素,而順序容器則通過元素在容器中的位置順序儲存和訪問元素。關聯容器 associative containers 支援通過鍵來高效地查詢和讀取元素。兩個基本的關聯容器型別是 map 和set。map 的元素以鍵 值 key val...