您好,登錄后才能下訂單哦!
這篇文章主要介紹了C++中map字典怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
若想在 C++ 中使用 map 類型創(chuàng)建字典,則需要包含 map 頭文件,如下:
#include <map>
map 類型的定義如下:
map<KeyType, ValueType> dict;
其中,KeyType 代表鍵的數(shù)據(jù)類型,ValueType 代表值的數(shù)據(jù)類型。KeyType 默認(rèn)是 const 類型,即鍵在確認(rèn)之后為只讀數(shù)據(jù)。另外,在一個 map 數(shù)據(jù)中,一個鍵只能出現(xiàn)一次;而在 multimap 類型數(shù)據(jù)中,一個鍵可以出現(xiàn)多次,本次主要討論 map 數(shù)據(jù)??聪旅嬉粋€例子:
#include <iostream> #include <string> #include <map> using namespace std; int main(void) { map<string, int> dict{{"key1", 2}}; // 定義一個 map 類型數(shù)據(jù) dict["key2"] = 3; // 創(chuàng)建并賦值 dict["key3"] ; cout << "length of dict: " << dict.size() << endl; // 長度 cout << dict["key1"] << endl; // 查找 cout << dict["key2"] << endl; cout << dict["key3"] << endl; // 值默認(rèn)為0 } //======= 運(yùn)行結(jié)果如下 ========// length of dict: 2 2 3 0
例子中首先聲明了一個 map 類型數(shù)據(jù) dict ,key 的數(shù)據(jù)類型為 string ,value 的數(shù)據(jù)類型為 int。初始化時注意一對鍵值對要放在一對花括號{}中,并用逗號隔開:
{key, value}
如果鍵 key 對還未出現(xiàn)在 dict 中,下標(biāo)運(yùn)算會創(chuàng)建一個新元素,其值默認(rèn)為 0 。這里創(chuàng)建了三個鍵值對,一個key 為 字符串 "key1" ,值為 2;key 為 字符串 "key3" 的鍵值對由于未被賦值,因此其值默認(rèn)為 0 。
上述 dict 字典中存儲的每一個數(shù)據(jù)都是 pair 類型的數(shù)據(jù),即 map 數(shù)據(jù)是一群 pair 類型的集合。一個 pair 保存兩數(shù)據(jù)成員: first 和 second,分別用來存儲一個鍵值對的 鍵 和 值 ,其中 first 成員是 const 的,這也解釋了上面提到的 鍵在確認(rèn)之后為只讀數(shù)據(jù)。pair 的標(biāo)準(zhǔn)庫類型定義在頭文件 utility 中,在定義一個 pair 時,其默認(rèn)構(gòu)造函數(shù)會對數(shù)據(jù)成員進(jìn)行初始化。一個例子如下:
int main(void) { pair<string, int> a_pair{"key", 1}; // 定義一個 pair 并初始化 cout << a_pair.first << ": " << a_pair.second << endl; } // =========== 運(yùn)行結(jié)果 =========== // key: 1
map 數(shù)據(jù)的遍歷主要有兩種方法,一個是直接遍歷,另一種是使用迭代器的遍歷。
#include <iostream> #include <string> #include <map> using namespace std; int main(void) { map<string, int> dict; // 定義一個 map 類型數(shù)據(jù) dict["key1"] = 2; // 創(chuàng)建并賦值 dict["key2"] = 3; // dict["key3"] ; // 默認(rèn)值為0 for(auto c : dict) // 遍歷,c++11 特有循環(huán)方式 { cout << c.first << ": " << c.second << endl; } } //============ 運(yùn)行結(jié)果 ============// key1: 2 key2: 3 key3: 0
這種遍歷方式就是 for 循環(huán)直接遍歷。每次循環(huán)都會從 dict 中提取一個 pair 類型的對象存入 c 中以供后續(xù)操作。
map 支持 vector 中的 begin、end、cbegin、cend 操作,因此我們可以使用這些函數(shù)獲取迭代器,然后使用迭代器來遍歷 map。begin、end 指向首元素以及尾元素之后位置(one past the last element)的迭代器,而容器中的元素位于 begin 與 end 之間,不包含 end,即是一個左閉右開的區(qū)間:[begin,end)。cbegin、cend 是C++11引入的新標(biāo)準(zhǔn),返回 const_iterator,只能用來讀取迭代器所指向內(nèi)容的數(shù)據(jù),不能修改數(shù)據(jù) 。一個使用迭代器遍歷的例子如下:
#include <iostream> #include <string> #include <map> using namespace std; int main(void) { // 定義并初始化一個 map 類型數(shù)據(jù) map<string, int> dict{{"key1", 1}, {"key2", 2}, {"key3", 3}}; auto map_it = dict.begin(); // 獲取指向首元素的迭代器 // 判斷范圍,比較當(dāng)前迭代器和尾后元素迭代器 while (map_it != dict.end()) { cout << map_it->first << ": " << map_it->second << endl; map_it++; // 迭代器遞增,移動到下一個元素 } }
map 的 insert 成員函數(shù)用來添加一個元素或者一個元素范圍,emplace 成員函數(shù)用來添加單個元素。使用 insert 方法向 map 中添加元素的方法如下,不過常用的方式就是第一種方式,剩下的仨了解下就行。
dict.insert({"key", 1}) // 或者 dict.emplace({"key", 1}) dict.insert(make_pair("key", 1)) dict.insert(pair<string, int>("key", 1)) dict.insert(map<string, int>::value_type("key", 1))
另外對于一個不存在的鍵的單一元素的 insert 或者 emplace 的插入操作會返回一個 pair ,告訴我們是否添加成功,該 pair 的 first 成員是一個迭代器,指向具有給定關(guān)鍵字的元素,second 成員是一個 bool 值,指出元素是插入成功還是已存在于 dict 中,如果之前不存在,則返回true;如果先前已存在,則值為 false。
int main(void) { map<string, int> dict{{"key1", 1}}; // 定義一個 map auto ret1 = dict.insert({"key2", 1}); // 執(zhí)行插入操作,若 "key"不存在于dict中,則返回 cout << "attention: ret1.first is a iterator points the element we insert" << endl; cout << ret1.first->first << ":" << ret1.first->second << endl; cout << "key2 insert successfully? " << ret1.second << endl; auto ret2 = dict.insert({"key1", 3}); // "key"已存在于dict中,則insert什么也不做 cout << "attention: ret2.first is a iterator points the element we insert" << endl; cout << ret2.first->first << ":" << ret2.first->second << endl; cout << "key1 insert successfully? " << ret2.second << endl; } //========= 運(yùn)行結(jié)果 ==========// attention: ret1.first is a iterator points the element we insert key2:1 key2 insert successfully? 1 attention: ret2.first is a iterator points the element we insert key1:1 key1 insert successfully? 0
例子中的返回值 pair 的完整類型如下:
pair<map<string, int>::iterator, bool>
但是!上面的 insert 方式還是麻煩了點(diǎn),不如直接使用文章開頭說的下標(biāo)操作!如果鍵 key 對還未出現(xiàn)在 dict 中,下標(biāo)運(yùn)算會創(chuàng)建一個新元素,其值默認(rèn)為 0 。
當(dāng)插入一個元素范圍時,可以做如下操作,這時沒有返回值。
dict.insert(dict2.begin(), dict2.end());
map 有三個版本的 erase 操作,分別如下:
從 dict 中刪除 鍵 為 key 的元素,返回刪除元素的數(shù)量,對于 map 類型來說為 1。
從 dict 中刪除迭代器 p 指定的元素。p 必須指向 dict 中一個真實(shí)元素且不能等于 dict.end()。返回一個指向 p 之后的元素的迭代器。
從 dict 中刪除迭代器 b 和 e 之間的元素,返回e。
int main(void) { // 定義并初始化一個 map 類型數(shù)據(jù) map<string, int> dict{{"key1", 1}, {"key2", 2}, {"key3", 3}, {"key4", 4}, {"key5", 5}}; int ret1 = dict.erase("key1"); // 刪除鍵為 "key1" 的元素 cout << "ret1: " << ret1 << endl; auto ret2 = dict.erase(dict.begin()); // 使用迭代器 cout << "(ret2->first:ret2->second) = " << ret2->first << ":" << ret2->second << endl; auto ret3 = dict.erase(dict.begin(), dict.end()); // 清空 cout << "ret3->first: " << ret3->first << endl; } //=========== 運(yùn)行結(jié)果 ============// ret1: 1 (ret2->first:ret2->second) = key3:3 ret3->first:
map 提供了一些查找元素的操作如下:
1、dict.find(key) // 返回一個迭代器 ,指向第一個鍵為 key 的元素,若 key 不存在于 dict 中,則返回 dict.end() 2、dict.count(key) // 返回鍵為 key 的元素的數(shù)量,對于 map 來說,返回1 3、dict.lower_bound(key) // 返回一個迭代器,指向第一個鍵不小于 key 的元素 4、dict.upper_bound(key) // 返回一個迭代器,指向第一個鍵大于 key 的元素 5、dict.equal_range(key) // 返回一個迭代器pair,表示關(guān)鍵字恩于 key 的元素的范圍。如果不存在,則pair的兩個成員均為 //dict.end()
一般來說,2~5的方法多用于 multimap 類型的數(shù)據(jù)中。如果只是想查詢一個元素是否存在于 dict 中,則使用 find 是最好的選擇。
另外需要注意的是,如果使用下標(biāo)操作訪問元素,如果該元素并不存在于 dict 中,則該操作會創(chuàng)建一個元素,因此,使用什么樣的訪問方式需要根據(jù)我們的使用環(huán)境進(jìn)行選擇。
map 是基于樹的結(jié)構(gòu)的,并且內(nèi)部元素是有序的,即是經(jīng)過鍵排序的:如果鍵的類型是數(shù)字,則按照數(shù)字大小進(jìn)行排序,如果是 string,則按照字典序進(jìn)行排序。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“C++中map字典怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。