關聯容器和順序容器的本質差別在於:關聯容器通過鍵(key)儲存和讀取元素,而順序容器則通過元素在容器中的位置順序儲存和訪問元素。
關聯容器(associative containers)支援通過鍵來高效地查詢和讀取元素。兩個基本的關聯容器型別是 map 和set。map 的元素以鍵-值(key-value)對的形式組織:鍵用作元素在 map 中的索引,而值則表示所儲存和讀取的資料。set僅包含乙個鍵,並有效地支援關於某個鍵是否存在的查詢。
一般來說,如果希望有效地儲存不同值的集合,那麼使用 set 容器比較合適,而 map 容器則更適用於需要儲存(乃至修改)每個鍵所關聯的值的情況。在做某種文字處理時,可使用 set 儲存要忽略的單詞。而字典則是 map 的一種很好的應用:單詞本身是鍵,而它的解釋說明則是值。
set 和 map 型別的物件所包含的元素都具有不同的鍵,不允許為同乙個鍵新增第二個元素。如果乙個鍵必須對應多個例項,則需使用 multimap 或 multiset,這兩種型別允許多個元素擁有相同的鍵。
10.1.引言:pair 型別
pair該型別在 utility 標頭檔案中定義。
表 10.2 pairs 型別提供的操作
pair的建立和初始化
在建立 pair 物件時,必須提供兩個型別名:pair 物件所包含的兩個資料成員各自對應的型別名字,這兩個型別必相同。
pairanon; // holds two strings
pairword_count; // holds a string and an int
pair> line; // holds string and vector
如果在建立 pair 物件時不提供初始化式,則呼叫預設建構函式對其成員採用值初始化。
當然,也可在定義時為每個成員提供初始化式:
pairauthor("james", "joyce");
pair 型別的使用相當繁瑣,因此,如果需要定義多個相同的pair 型別物件,可考慮利用 typedef 簡化其宣告:
typedef pairauthor;
authorproust("marcel", "proust");
pairs物件的操作
對於 pair 類,可以直接訪問其資料成員:其成員都是僅有的,分別命名為 first 和 second。只需使用普通的點操作符——成員訪問標誌即可訪問其成員:
string firstbook;
// access and test the data members of the pair
if (author.first == "james" && author.second == "joyce")
firstbook = "stephen hero";
生成新的 pair 物件make_pair 函式,由傳遞給它的兩個實參生成乙個新的 pair 物件。可如下使用該函式建立新的 pair 物件,並賦給已存在的 pair 物件:
#include #include using namespace std;
int _tmain(int argc, _tchar* argv)
{
pairnext_auth;
string first, last;
while (cin >> first >> last)
{ // generate a pair from first and last
next_auth = make_pair(first, last);
// process next_auth...
cout<
10.2.關聯容器
關聯容器共享大部分——但並非全部——的順序容器操作。關聯容器不提供 front、 push_front、 pop_front、back、push_back 以及 pop_back 操作。順序容器和關聯容器公共的操作包括下面的幾種:
• 表 9.2 描述的前三種建構函式:
cc; // creates an empty container
// c2 must be same type as c1
cc1(c2); // copies elements from c2 into c1
// b and e are iterators denoting a sequence
cc(b, e); // copies elements from the sequence into c
關聯容器不能通過容器大小來定義,因為這樣的話就無法知道鍵所對應的值是什麼。
• 第 9.3.4 節中描述的關係運算。
• 表 9.6 列出的 begin、end、rbegin 和 rend 操作。
• 表 9.5 列出的型別別名(typedef)。注意,對於 map 容器,value_type
並非元素的型別,而是描述鍵及其關聯值型別的 pair 型別。第 10.3.2
節將詳細解釋 map 中的型別別名。
• 表 9.11 中描述的 swap 和賦值操作。但關聯容器不提供 assign 函式。
• 表 9.10 列出的 clear 和 erase 操作,但關聯容器的 erase 運算返回
void 型別。
• 表 9.8 列出的關於容器大小的操作。但 resize 函式不能用於關聯容器。
根據鍵排列元素
「容器元素根據鍵的次序排列」這一事實就是乙個重要的結論:在迭代遍歷關聯容器時,我們可確保按鍵的順序的訪問元素,而與元素在容器中的存放位置完全無關。
10.3.map 型別
map 是鍵-值對的集合。map 型別通常可理解為關聯陣列(associative array):可使用鍵作為下標來獲取乙個值,正如內建陣列型別一樣。而關聯的本質在於元素的值與某個特定的鍵相關聯,而並非通過元素在陣列中的位置來獲取。
10.3.1.map 物件的定義
要使用 map 物件,則必須包含 map 標頭檔案。在定義 map 物件時,必須分別指明鍵和值的型別(valuetype)(表 10.4):
mapword_count; // empty map from string to int
表 10.3. map 的建構函式
鍵型別的約束
標準庫使用鍵型別定義的 < 操作符來實現鍵(key type)的比較。所用的比較函式必須在鍵型別上定義嚴格弱排序(strict weak ordering)。所謂的嚴格弱排序可理解為鍵型別資料上的「小於」關係
在實際應用中,鍵型別必須定義 < 操作符,而且該操作符應能 「正確地工作」,這一點很重要。
對於鍵型別,唯一的約束就是必須支援 < 操作符,至於是否支援其他的關係或相等運算,則不作要求。
《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...
C Primer學習筆記 10 關聯容器
題記 本系列學習筆記 c primer學習筆記 主要目的是討論一些容易被大家忽略或者容易形成錯誤認識的內容。只適合於有了一定的c 基礎的讀者 至少學完一本c 教程 本文主要討論c 標準庫中的關聯容器 associative container 內容主要涉及map,set,multimap和multi...
C Primer 學習筆記 關聯容器初識
關聯容器中元素按照關鍵字來訪問和儲存 map key value對 字典中單詞是key,單詞釋義是value 關聯陣列,set 只儲存關鍵字 multimap multiset 允許多個元素具有相同的關鍵字 map map map words string word while cin word f...