1.關聯容器型別
有序容器使用比較函式來比較關鍵字,從而將元素按順序儲存。預設情況下,比較操作是採用關鍵字型別的《運算子。無序容器使用關鍵字型別的==運算子和乙個hash型別的物件來組織元素。
<1>按關鍵字有序儲存
map關聯陣列;儲存關鍵字-值對
set關鍵字即值,即只儲存關鍵字的容器
multimap
關鍵字可重複出現的map
multiset
關鍵字可重複出現的set
<2>無序集合
unordered_map
用雜湊函式組織的map
unordered_set
用雜湊函式組織的set
unordered_multimp
雜湊組織的map;關鍵字可以重複出現
unordered_multiset
雜湊組織的set;關鍵字可以重複出現
<3>map和set混用例項
int main()
; string word;
while (cin >> word)
if (exclude.find(word) == exclude.end())//只統計不在exclude中的單詞
++word_count[word];//如果word還未在map中,下標運算子會建立乙個新元素
for (auto w : word_count)
cout << w.first << " occurs " << w.second <<((w.second>1)?" times ":" time ")<< endl;
system("pause");
return 0;
}
2.pair型別
<1>乙個pair儲存兩個資料成員。類似容器,pair是乙個用來生成特定型別的模板。定義在標頭檔案utility中。
pairp1;
pairp2;
3.關聯容器操作
<1>
key_type
容器型別的關鍵字型別
每個關鍵字關聯的型別;只適用於map
value_type
int main()
<2>關聯容器迭代器
當解引用乙個關聯容器迭代器時,我們會得到乙個型別為容器的value_type的值的引用。注意:不能改變關鍵字成員的值。
int main()
,, };
auto map_it = m.begin();
map_it->first = 5;//錯誤。「map_it」: 不能給常量賦值
map_it->second = "yan";//正確
system("pause");
return 0;
}
set的迭代器是const的,所以可以用乙個set迭代器來讀取元素的值,但不能修改。
int main()
; set::iterator set_it = s.begin();
*set_it = 6;//錯誤。「set_it」: 不能給常量賦值
system("pause");
return 0;
}
4.向關聯容器中新增元素
<1>要注意的是,map中元素的型別是pair。
int main()
); word_count.insert(pair("rong", 3));
system("pause");
return 0;
}
<2>insert返回的值依賴於容器型別和引數。對於不包含關鍵字的容器,新增單一元素的insert和emplace版本返回乙個pair。pair的first成員是乙個迭代器,指向具有給定關鍵字的元素;second成員是乙個bool值,指出元素是插入成功還是已經存在於容器中。如果關鍵字已經存在於容器中,則insert什麼事情也不做,返回值的bool部分為false。如果關鍵字不存在,元素被插入到容器中,且bool值為true。
理解下面**(c++ primerp385頁):
int main()
); if (!ret.second)
++ret.first->second;
} system("pause");
return 0;
}
<3>向multiset或multimap中新增元素時,insert總會插入乙個元素。此時,insert操作返回乙個指向新元素的迭代器,指向這個新插入的元素。
5.向關聯容器中刪除元素
c.erase(k)
從c中刪除每個關鍵字為k的元素。返回乙個size_type值。指出刪除元素的數量。
c.erase(p)
從c中刪除迭代器p指定的元素。p必須指向c中乙個真實元素,不能等於c.end()。返回乙個指向p之後元素的迭代器。若p指向c中的尾元素,則返回c.end()
c.erase(b,e)
刪除迭代器對b和e所表示的範圍中的元素。返回e
6.map的下標操作
map和unordered_map容器提供了下標運算子和乙個對應的at函式。注意set型別不支援下標運算子,因為沒有於關鍵字相關聯的值。同時,也不能對乙個multimap或乙個unordered_multimap進行下標操作,因為這兩個容器可能有多個值與乙個關鍵字相對應。
map的下標運算與以前其它下標運算的不同之處是返回型別。一般來說,解引用乙個迭代器返回的型別與下標運算子返回的型別是一樣的。但在map中,當對map進行下標操作時,會得到乙個value_type物件(值),但當解引用乙個map迭代器時,會得到value_type物件(pair)。此外,若關鍵字還未在map中,下標運算子會新增乙個新元素。
7.訪問元素
<1>lower_bound或upper_bound不適用於無序容器。此外,下標和at操作只適應用於非const的map和unordered_map。
c.find(k)
返回乙個迭代器,指向第乙個關鍵字為k的元素,若k不在容器中,則返回尾後迭代器
c.count(k)
返回關鍵字等於k的元素的數量。對於不允許重複關鍵字的容器,返回值永遠是0或1
c.lower_bound(k)
返回乙個迭代器,指向第乙個關鍵字不小於k的元素
c.upper_bound(k)
返回乙個迭代器,指向第乙個關鍵字大於k的元素
c.equal_range(k)
返回乙個迭代器pair,表示關鍵字等於k的元素的範圍。若k不存在,pair的兩個成員均等於c.end()
<2>對map使用find代替下標操作
下標操作的***是有時我們只想知道乙個元素是否在map中,但利用下標操作使得元素不存在時會自動新增。所以只檢視時可以借助上表中的方法。
<3>應用舉例
int main()
system("pause");
return 0;
}
int main()
c 關聯容器
1.map建構函式 mapm 普通初始化 mapm m2 複製初始化法 mapm b,e 另乙個map物件的迭代器初始化法 注意 1 鍵值型別必須定義 操作符號,資料訪問時需要呼叫。2 m aaa 下表訪問方式導致的結果是,若鍵對應的值不存在,則插入該鍵值對應的預設值。2.map插入操作 m.ins...
C 關聯容器
1.關聯容器是通過關鍵字來儲存和訪問資料的。關聯容器分為兩大類 map和set。其中,map是通過鍵值對來操作的,這裡的鍵就是關鍵字,值就是對應的資料。例如 mapm 定義了乙個空的map變數m,它的關鍵字型別是int,關鍵字對應的值的型別是int。可以將map理解成為函式,關鍵字是自變數,關鍵字對...
C 關聯容器
1 關聯容器定義 關聯容器和順序容器的本質差別在於 關聯容器通過鍵 key 儲存和讀取元素,而順序容器 則通過元素在容器中的位置順序儲存和訪問元素。關聯容器 associative containers 支援通過鍵來高效地查詢和讀取元素。兩個基本的關聯容器型別是 map set。map 的元素以鍵 ...