C++中的關(guān)聯(lián)式容器map用法

關(guān)聯(lián)式容器是什么

?關(guān)聯(lián)式容器在存儲元素值的同時,還會為各元素額外再配備一個值(又稱為“鍵”,其本質(zhì)也是一個 C++ 基礎(chǔ)數(shù)據(jù)類型或自定義類型的元素),它的功能是在使用關(guān)聯(lián)式容器的過程中,如果已知目標(biāo)元素的鍵的值,則直接通過該鍵就可以找到目標(biāo)元素,而無需再通過遍歷整個容器的方式。
?使用關(guān)聯(lián)式容器存儲的元素,都是一個一個的“鍵值對”( <key,value> ),這是和序列式容器最大的不同。除此之外,序列式容器中存儲的元素默認(rèn)都是未經(jīng)過排序的,而使用關(guān)聯(lián)式容器存儲的元素,默認(rèn)會根據(jù)各元素的鍵值的大小做升序排序。

關(guān)聯(lián)式容器名稱 特點(diǎn)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? map 定義在 <map> 頭文件中,使用該容器存儲的數(shù)據(jù),其各個元素的鍵必須是唯一的(即不能重復(fù)),該容器會根據(jù)各元素鍵的大小,默認(rèn)進(jìn)行升序排序(調(diào)用 std::less<T>)。可以快速查找、讀取或者刪除所存儲的元素,同時該類型容器插入元素的效率也比序列式容器高。
set ?? 定義在 <set> 頭文件中,使用該容器存儲的數(shù)據(jù),各個元素鍵和值完全相同,且各個元素的值不能重復(fù)(保證了各元素鍵的唯一性)。該容器會自動根據(jù)各個元素的鍵(其實(shí)也就是元素值)的大小進(jìn)行升序排序(調(diào)用 std::less<T>)。
multimap 定義在 <map> 頭文件中,和 map 容器唯一的不同在于,multimap 容器中存儲元素的鍵可以重復(fù)。
multiset 定義在 <set> 頭文件中,和 set 容器唯一的不同在于,multiset 容器中存儲元素的值可以重復(fù)(一旦值重復(fù),則意味著鍵也是重復(fù)的)。

pair類模板

pair 類模板定義在<utility>頭文件。
考慮到“鍵值對”并不是普通類型數(shù)據(jù),C++STL 標(biāo)準(zhǔn)庫提供了 pair 類模板,其專門用來將 2 個普通元素 first 和 second(可以是 C++ 基本數(shù)據(jù)類型、結(jié)構(gòu)體、類自定的類型)創(chuàng)建成一個新元素<first, second>

map

map 容器存儲的都是 pair 對象,也就是用 pair 類模板創(chuàng)建的鍵值對。各個鍵值對的鍵和值可以是任意數(shù)據(jù)類型,包括 C++ 基本數(shù)據(jù)類型(int、double 等)、使用結(jié)構(gòu)體或類自定義的類型。(一般情況下,使用string類型做鍵值對的類型)
需要注意的是,使用 map 容器存儲的各個鍵值對,鍵的值既不能重復(fù)也不能被修改。換句話說,map 容器中存儲的各個鍵值對不僅鍵的值獨(dú)一無二,鍵的類型也會用 const 修飾,這意味著只要鍵值對被存儲到 map 容器中,其鍵的值將不能再做任何修改。

使用

map 容器定義在<map> 頭文件中,并位于 std 命名空間中。

#include <map>  
using namespace std;  

創(chuàng)建方法

1.調(diào)用 map 容器類的默認(rèn)構(gòu)造函數(shù),可以創(chuàng)建出一個空的 map 容器。

std::map<std::string, int>Map1;  

2.創(chuàng)建時也可以初始化 。

std::map<std::string, int>Map1{ {"C語言",10},{"STL",20} };

3.也可以利用先前已創(chuàng)建好的 map 容器,再創(chuàng)建一個新的 map 容器。

std::map<std::string, int>newMap(Map1);

~這里了解一下吧,當(dāng)有臨時的 map 對象作為參數(shù),傳遞給要初始化的 map 容器時,此時就會調(diào)用移動構(gòu)造函數(shù)。~

#創(chuàng)建一個會返回臨時 map 對象的函數(shù)
std::map<std::string,int> disMap() {
    std::map<std::string, int>tempMap{ {"C",10},{"STL",20} };
    return tempMap;
}
//調(diào)用 map 類模板的移動構(gòu)造函數(shù)創(chuàng)建 newMap 容器
std::map<std::string, int>newMap(disMap());

map容器包含的成員方法

成員方法 功能
begin() 返回指向容器中第一個(注意,是已排好序的第一個)鍵值對的雙向迭代器。如果 map 容器用 const 限定,則該方法返回的是 const 類型的雙向迭代器
end() ?? 返回指向容器最后一個元素(注意,是已排好序的最后一個)所在位置后一個位置的雙向迭代器,通常和 begin() 結(jié)合使用。如果 map 容器用 const 限定,則該方法返回的是 const 類型的雙向迭代器。
rbegin() 返回指向最后一個(注意,是已排好序的最后一個)元素的反向雙向迭代器。如果 map 容器用 const 限定,則該方法返回的是 const 類型的反向雙向迭代器。
rend() ?? 返回指向第一個(注意,是已排好序的第一個)元素所在位置前一個位置的反向雙向迭代器。如果 map 容器用 const 限定,則該方法返回的是 const 類型的反向雙向迭代器。
cbegin() 和 begin() 功能相同,只不過在其基礎(chǔ)上,增加了 const 屬性,不能用于修改容器內(nèi)存儲的鍵值對。
cend() ?? 和 end() 功能相同,只不過在其基礎(chǔ)上,增加了 const 屬性,不能用于修改容器內(nèi)存儲的鍵值對。
crbegin() 和 rbegin() 功能相同,只不過在其基礎(chǔ)上,增加了 const 屬性,不能用于修改容器內(nèi)存儲的鍵值對。
crend() 和 rend() 功能相同,只不過在其基礎(chǔ)上,增加了 const 屬性,不能用于修改容器內(nèi)存儲的鍵值對。
find(key) 在 map 容器中查找鍵為 key 的鍵值對,如果成功找到,則返回指向該鍵值對的雙向迭代器;反之,則返回和 end() 方法一樣的迭代器。另外,如果 map 容器用 const 限定,則該方法返回的是 const 類型的雙向迭代器。
lower_bound(key) 返回一個指向當(dāng)前 map 容器中第一個大于或等于 key 的鍵值對的雙向迭代器。如果 map 容器用 const 限定,則該方法返回的是 const 類型的雙向迭代器。
upper_bound(key) 返回一個指向當(dāng)前 map 容器中第一個大于 key 的鍵值對的迭代器。如果 map 容器用 const 限定,則該方法返回的是 const 類型的雙向迭代器。
equal_range(key) 該方法返回一個 pair 對象(包含 2 個雙向迭代器),其中 pair.first 和 lower_bound() 方法的返回值等價,pair.second 和 upper_bound() 方法的返回值等價。也就是說,該方法將返回一個范圍,該范圍中包含的鍵為 key 的鍵值對(map 容器鍵值對唯一,因此該范圍最多包含一個鍵值對)。
empty() 若容器為空,則返回 true;否則 false。
size() ?? 返回當(dāng)前 map 容器中存有鍵值對的個數(shù)。
max_size() 返回 map 容器所能容納鍵值對的最大個數(shù),不同的操作系統(tǒng),其返回值亦不相同。
operator[] map容器重載了 [] 運(yùn)算符,只要知道 map 容器中某個鍵值對的鍵的值,就可以向獲取數(shù)組中元素那樣,通過鍵直接獲取對應(yīng)的值。
at(key) 找到 map 容器中 key 鍵對應(yīng)的值,如果找不到,該函數(shù)會引發(fā) out_of_range 異常。
insert() 向 map 容器中插入鍵值對。
erase() 刪除 map 容器指定位置、指定鍵(key)值或者指定區(qū)域內(nèi)的鍵值對。后續(xù)章節(jié)還會對該方法做重點(diǎn)講解。
swap() 交換 2 個 map 容器中存儲的鍵值對,這意味著,操作的 2 個鍵值對的類型必須相同。
clear() 清空 map 容器中所有的鍵值對,即使 map 容器的 size() 為 0。
emplace() 在當(dāng)前 map 容器中的指定位置處構(gòu)造新鍵值對。其效果和插入鍵值對一樣,但效率更高。
emplace_hint() 在本質(zhì)上和 emplace() 在 map 容器中構(gòu)造新鍵值對的方式是一樣的,不同之處在于,使用者必須為該方法提供一個指示鍵值對生成位置的迭代器,并作為該方法的第一個參數(shù)。
count(key) 在當(dāng)前 map 容器中,查找鍵為 key 的鍵值對的個數(shù)并返回。注意,由于 map 容器中各鍵值對的鍵的值是唯一的,因此該函數(shù)的返回值最大為 1。

以begin()end()寫一個程序。

#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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容