關(guān)聯(lián)式容器是什么
?關(guān)聯(lián)式容器在存儲(chǔ)元素值的同時(shí)驶臊,還會(huì)為各元素額外再配備一個(gè)值(又稱為“鍵”,其本質(zhì)也是一個(gè) C++ 基礎(chǔ)數(shù)據(jù)類型或自定義類型的元素)对湃,它的功能是在使用關(guān)聯(lián)式容器的過程中鸠珠,如果已知目標(biāo)元素的鍵的值饺蔑,則直接通過該鍵就可以找到目標(biāo)元素锌介,而無需再通過遍歷整個(gè)容器的方式。
?使用關(guān)聯(lián)式容器存儲(chǔ)的元素猾警,都是一個(gè)一個(gè)的“鍵值對”( <key,value> )孔祸,這是和序列式容器最大的不同。除此之外发皿,序列式容器中存儲(chǔ)的元素默認(rèn)都是未經(jīng)過排序的崔慧,而使用關(guān)聯(lián)式容器存儲(chǔ)的元素,默認(rèn)會(huì)根據(jù)各元素的鍵值的大小做升序排序穴墅。
關(guān)聯(lián)式容器名稱 | 特點(diǎn) |
---|---|
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? map | 定義在 <map> 頭文件中惶室,使用該容器存儲(chǔ)的數(shù)據(jù),其各個(gè)元素的鍵必須是唯一的(即不能重復(fù))玄货,該容器會(huì)根據(jù)各元素鍵的大小皇钞,默認(rèn)進(jìn)行升序排序(調(diào)用 std::less<T>)。可以快速查找松捉、讀取或者刪除所存儲(chǔ)的元素夹界,同時(shí)該類型容器插入元素的效率也比序列式容器高。
|
set ?? | 定義在 <set> 頭文件中隘世,使用該容器存儲(chǔ)的數(shù)據(jù)可柿,各個(gè)元素鍵和值完全相同鸠踪,且各個(gè)元素的值不能重復(fù)(保證了各元素鍵的唯一性)。該容器會(huì)自動(dòng)根據(jù)各個(gè)元素的鍵(其實(shí)也就是元素值)的大小進(jìn)行升序排序(調(diào)用 std::less<T>)复斥。 |
multimap | 定義在 <map> 頭文件中营密,和 map 容器唯一的不同在于,multimap 容器中存儲(chǔ)元素的鍵可以重復(fù)目锭。 |
multiset | 定義在 <set> 頭文件中卵贱,和 set 容器唯一的不同在于,multiset 容器中存儲(chǔ)元素的值可以重復(fù)(一旦值重復(fù)侣集,則意味著鍵也是重復(fù)的)键俱。 |
pair類模板
pair 類模板定義在<utility>
頭文件。
考慮到“鍵值對”并不是普通類型數(shù)據(jù)世分,C++STL 標(biāo)準(zhǔn)庫提供了 pair 類模板编振,其專門用來將 2 個(gè)普通元素 first 和 second(可以是 C++ 基本數(shù)據(jù)類型、結(jié)構(gòu)體臭埋、類自定的類型)創(chuàng)建成一個(gè)新元素<first, second>
踪央。
map
map 容器存儲(chǔ)的都是 pair 對象,也就是用 pair 類模板創(chuàng)建的鍵值對瓢阴。各個(gè)鍵值對的鍵和值可以是任意數(shù)據(jù)類型畅蹂,包括 C++ 基本數(shù)據(jù)類型(int、double 等)荣恐、使用結(jié)構(gòu)體或類自定義的類型液斜。(一般情況下,使用string類型做鍵值對的類型)
需要注意的是叠穆,使用 map 容器存儲(chǔ)的各個(gè)鍵值對少漆,鍵的值既不能重復(fù)也不能被修改。換句話說硼被,map 容器中存儲(chǔ)的各個(gè)鍵值對不僅鍵的值獨(dú)一無二示损,鍵的類型也會(huì)用 const 修飾,這意味著只要鍵值對被存儲(chǔ)到 map 容器中嚷硫,其鍵的值將不能再做任何修改检访。
使用
map 容器定義在<map>
頭文件中,并位于 std 命名空間中仔掸。
#include <map>
using namespace std;
創(chuàng)建方法
1.調(diào)用 map 容器類的默認(rèn)構(gòu)造函數(shù)脆贵,可以創(chuàng)建出一個(gè)空的 map 容器。
std::map<std::string, int>Map1;
2.創(chuàng)建時(shí)也可以初始化 嘉汰。
std::map<std::string, int>Map1{ {"C語言",10},{"STL",20} };
3.也可以利用先前已創(chuàng)建好的 map 容器丹禀,再創(chuàng)建一個(gè)新的 map 容器。
std::map<std::string, int>newMap(Map1);
~這里了解一下吧,當(dāng)有臨時(shí)的 map 對象作為參數(shù)双泪,傳遞給要初始化的 map 容器時(shí)持搜,此時(shí)就會(huì)調(diào)用移動(dòng)構(gòu)造函數(shù)。~
#創(chuàng)建一個(gè)會(huì)返回臨時(shí) map 對象的函數(shù)
std::map<std::string,int> disMap() {
std::map<std::string, int>tempMap{ {"C",10},{"STL",20} };
return tempMap;
}
//調(diào)用 map 類模板的移動(dòng)構(gòu)造函數(shù)創(chuàng)建 newMap 容器
std::map<std::string, int>newMap(disMap());
map容器包含的成員方法
成員方法 | 功能 |
---|---|
begin() | 返回指向容器中第一個(gè)(注意焙矛,是已排好序的第一個(gè))鍵值對的雙向迭代器葫盼。如果 map 容器用 const 限定贴妻,則該方法返回的是 const 類型的雙向迭代器 |
end() ?? | 返回指向容器最后一個(gè)元素(注意孵坚,是已排好序的最后一個(gè))所在位置后一個(gè)位置的雙向迭代器,通常和 begin() 結(jié)合使用贼陶。如果 map 容器用 const 限定蟆盹,則該方法返回的是 const 類型的雙向迭代器孩灯。 |
rbegin() | 返回指向最后一個(gè)(注意,是已排好序的最后一個(gè))元素的反向雙向迭代器逾滥。如果 map 容器用 const 限定峰档,則該方法返回的是 const 類型的反向雙向迭代器。 |
rend() ?? | 返回指向第一個(gè)(注意寨昙,是已排好序的第一個(gè))元素所在位置前一個(gè)位置的反向雙向迭代器讥巡。如果 map 容器用 const 限定,則該方法返回的是 const 類型的反向雙向迭代器舔哪。 |
cbegin() | 和 begin() 功能相同欢顷,只不過在其基礎(chǔ)上,增加了 const 屬性捉蚤,不能用于修改容器內(nèi)存儲(chǔ)的鍵值對抬驴。 |
cend() ?? | 和 end() 功能相同,只不過在其基礎(chǔ)上外里,增加了 const 屬性怎爵,不能用于修改容器內(nèi)存儲(chǔ)的鍵值對特石。 |
crbegin() | 和 rbegin() 功能相同盅蝗,只不過在其基礎(chǔ)上,增加了 const 屬性姆蘸,不能用于修改容器內(nèi)存儲(chǔ)的鍵值對墩莫。 |
crend() | 和 rend() 功能相同,只不過在其基礎(chǔ)上逞敷,增加了 const 屬性狂秦,不能用于修改容器內(nèi)存儲(chǔ)的鍵值對。 |
find(key) | 在 map 容器中查找鍵為 key 的鍵值對推捐,如果成功找到裂问,則返回指向該鍵值對的雙向迭代器;反之,則返回和 end() 方法一樣的迭代器堪簿。另外痊乾,如果 map 容器用 const 限定,則該方法返回的是 const 類型的雙向迭代器椭更。 |
lower_bound(key) | 返回一個(gè)指向當(dāng)前 map 容器中第一個(gè)大于或等于 key 的鍵值對的雙向迭代器哪审。如果 map 容器用 const 限定,則該方法返回的是 const 類型的雙向迭代器虑瀑。 |
upper_bound(key) | 返回一個(gè)指向當(dāng)前 map 容器中第一個(gè)大于 key 的鍵值對的迭代器湿滓。如果 map 容器用 const 限定,則該方法返回的是 const 類型的雙向迭代器舌狗。 |
equal_range(key) | 該方法返回一個(gè) pair 對象(包含 2 個(gè)雙向迭代器)叽奥,其中 pair.first 和 lower_bound() 方法的返回值等價(jià),pair.second 和 upper_bound() 方法的返回值等價(jià)痛侍。也就是說而线,該方法將返回一個(gè)范圍,該范圍中包含的鍵為 key 的鍵值對(map 容器鍵值對唯一恋日,因此該范圍最多包含一個(gè)鍵值對)膀篮。 |
empty() | 若容器為空,則返回 true岂膳;否則 false誓竿。 |
size() ?? | 返回當(dāng)前 map 容器中存有鍵值對的個(gè)數(shù)。 |
max_size() | 返回 map 容器所能容納鍵值對的最大個(gè)數(shù)谈截,不同的操作系統(tǒng)筷屡,其返回值亦不相同。 |
operator[] | map容器重載了 [] 運(yùn)算符簸喂,只要知道 map 容器中某個(gè)鍵值對的鍵的值毙死,就可以向獲取數(shù)組中元素那樣,通過鍵直接獲取對應(yīng)的值喻鳄。 |
at(key) | 找到 map 容器中 key 鍵對應(yīng)的值扼倘,如果找不到,該函數(shù)會(huì)引發(fā) out_of_range 異常除呵。 |
insert() | 向 map 容器中插入鍵值對再菊。 |
erase() | 刪除 map 容器指定位置、指定鍵(key)值或者指定區(qū)域內(nèi)的鍵值對颜曾。后續(xù)章節(jié)還會(huì)對該方法做重點(diǎn)講解纠拔。 |
swap() | 交換 2 個(gè) map 容器中存儲(chǔ)的鍵值對,這意味著泛豪,操作的 2 個(gè)鍵值對的類型必須相同稠诲。 |
clear() | 清空 map 容器中所有的鍵值對侦鹏,即使 map 容器的 size() 為 0。 |
emplace() | 在當(dāng)前 map 容器中的指定位置處構(gòu)造新鍵值對臀叙。其效果和插入鍵值對一樣种柑,但效率更高。 |
emplace_hint() | 在本質(zhì)上和 emplace() 在 map 容器中構(gòu)造新鍵值對的方式是一樣的匹耕,不同之處在于聚请,使用者必須為該方法提供一個(gè)指示鍵值對生成位置的迭代器,并作為該方法的第一個(gè)參數(shù)稳其。 |
count(key) | 在當(dāng)前 map 容器中驶赏,查找鍵為 key 的鍵值對的個(gè)數(shù)并返回。注意既鞠,由于 map 容器中各鍵值對的鍵的值是唯一的煤傍,因此該函數(shù)的返回值最大為 1。 |
以begin()end()寫一個(gè)程序嘱蛋。
#include <iostream>
#include <map> // pair
#include <string> // string
u[sin](as)g namespace std;
int main()
{
//創(chuàng)建并初始化 map 容器
std::map<std::string, std::string>myMap{{"STL","a"},{"C語","b"} };
//調(diào)用 begin()/end() 組合蚯姆,遍歷 map 容器
for (auto iter = myMap.begin(); iter != myMap.end(); ++iter) {
cout << iter->first << " " << iter->second << endl;
}
return 0;
}
文章參考:《C語言中文網(wǎng)》http://c.biancheng.net/view/7169.html