一,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,所以只能做讀操作,不能做寫操作。
五,multimap和multiset型別
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...