最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中map 字典的基本使用教程

 更新時(shí)間:2021年09月15日 12:53:17   作者:你卷我不卷  
Map是字典一樣的數(shù)據(jù)結(jié)構(gòu),它是(鍵,值)對(duì)的關(guān)聯(lián)數(shù)組,其中每個(gè)唯一鍵僅與單個(gè)值相關(guān)聯(lián),下面這篇文章主要給大家介紹了關(guān)于C++中map 字典的基本使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在 C++ 中,map 是關(guān)聯(lián)容器的一種,關(guān)聯(lián)容器將值與鍵關(guān)聯(lián)到一起,并使用鍵來(lái)查找值。這與 python 中的字典類(lèi)型類(lèi)似,也是用來(lái)存儲(chǔ)鍵-值對(duì)(key-value) 形式的數(shù)據(jù)的,其同樣具有遍歷、插入、查詢(xún)、刪除等功能,下面將一一介紹。

1、map 類(lèi)型的聲明

若想在 C++ 中使用 map 類(lèi)型創(chuàng)建字典,則需要包含 map 頭文件,如下:

#include <map>

map 類(lèi)型的定義如下:

map<KeyType, ValueType> dict;

其中,KeyType 代表鍵的數(shù)據(jù)類(lèi)型,ValueType 代表值的數(shù)據(jù)類(lèi)型。KeyType 默認(rèn)是 const 類(lèi)型,即鍵在確認(rèn)之后為只讀數(shù)據(jù)。另外,在一個(gè) map 數(shù)據(jù)中,一個(gè)鍵只能出現(xiàn)一次;而在 multimap 類(lèi)型數(shù)據(jù)中,一個(gè)鍵可以出現(xiàn)多次,本次主要討論 map 數(shù)據(jù)??聪旅嬉粋€(gè)例子:

#include <iostream>
#include <string>
#include <map>
 
using namespace std;
int main(void)
{
    map<string, int> dict{{"key1", 2}};  // 定義一個(gè) map 類(lèi)型數(shù)據(jù) 
    dict["key2"] = 3;  // 創(chuàng)建并賦值
    dict["key3"] ;
    cout << "length of dict: " << dict.size() << endl;  // 長(zhǎng)度
    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

例子中首先聲明了一個(gè) map 類(lèi)型數(shù)據(jù) dict ,key 的數(shù)據(jù)類(lèi)型為 string ,value 的數(shù)據(jù)類(lèi)型為 int。初始化時(shí)注意一對(duì)鍵值對(duì)要放在一對(duì)花括號(hào){}中,并用逗號(hào)隔開(kāi):

{key, value}

如果鍵 key 對(duì)還未出現(xiàn)在 dict 中,下標(biāo)運(yùn)算會(huì)創(chuàng)建一個(gè)新元素,其值默認(rèn)為 0 。這里創(chuàng)建了三個(gè)鍵值對(duì),一個(gè)key 為 字符串 "key1" ,值為 2;key 為 字符串 "key3" 的鍵值對(duì)由于未被賦值,因此其值默認(rèn)為 0 。

2、pair 類(lèi)型

上述 dict 字典中存儲(chǔ)的每一個(gè)數(shù)據(jù)都是 pair 類(lèi)型的數(shù)據(jù),即 map 數(shù)據(jù)是一群 pair 類(lèi)型的集合。一個(gè) pair 保存兩數(shù)據(jù)成員: first 和 second,分別用來(lái)存儲(chǔ)一個(gè)鍵值對(duì)的 鍵 和 值 ,其中 first 成員是 const 的,這也解釋了上面提到的 鍵在確認(rèn)之后為只讀數(shù)據(jù)。pair 的標(biāo)準(zhǔn)庫(kù)類(lèi)型定義在頭文件 utility 中,在定義一個(gè) pair 時(shí),其默認(rèn)構(gòu)造函數(shù)會(huì)對(duì)數(shù)據(jù)成員進(jìn)行初始化。一個(gè)例子如下:

int main(void)
{
    pair<string, int> a_pair{"key", 1};  // 定義一個(gè) pair 并初始化
    cout << a_pair.first << ": " << a_pair.second << endl;
}
 
// =========== 運(yùn)行結(jié)果 =========== //
key: 1

3、map 數(shù)據(jù)的遍歷

map 數(shù)據(jù)的遍歷主要有兩種方法,一個(gè)是直接遍歷,另一種是使用迭代器的遍歷。

1)直接遍歷:

#include <iostream>
#include <string>
#include <map>
 
using namespace std;
int main(void)
{
    map<string, int> dict;  // 定義一個(gè) map 類(lèi)型數(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)都會(huì)從 dict 中提取一個(gè) pair 類(lèi)型的對(duì)象存入 c 中以供后續(xù)操作。

2)使用迭代器遍歷

map 支持 vector 中的 begin、end、cbegin、cend 操作,因此我們可以使用這些函數(shù)獲取迭代器,然后使用迭代器來(lái)遍歷 map。begin、end 指向首元素以及尾元素之后位置(one past the last element)的迭代器,而容器中的元素位于 begin 與 end 之間,不包含 end,即是一個(gè)左閉右開(kāi)的區(qū)間:[begin,end)。cbegin、cend 是C++11引入的新標(biāo)準(zhǔn),返回 const_iterator,只能用來(lái)讀取迭代器所指向內(nèi)容的數(shù)據(jù),不能修改數(shù)據(jù) 。一個(gè)使用迭代器遍歷的例子如下:

#include <iostream>
#include <string>
#include <map>
 
using namespace std;
 
int main(void)
{   
    // 定義并初始化一個(gè) map 類(lèi)型數(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++;  // 迭代器遞增,移動(dòng)到下一個(gè)元素
    }
}

4、添加元素

map 的 insert 成員函數(shù)用來(lái)添加一個(gè)元素或者一個(gè)元素范圍,emplace 成員函數(shù)用來(lái)添加單個(gè)元素。使用 insert 方法向 map 中添加元素的方法如下,不過(guò)常用的方式就是第一種方式,剩下的仨了解下就行。

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))

另外對(duì)于一個(gè)不存在的鍵的單一元素的 insert 或者 emplace 的插入操作會(huì)返回一個(gè) pair ,告訴我們是否添加成功,該 pair 的 first 成員是一個(gè)迭代器,指向具有給定關(guān)鍵字的元素,second 成員是一個(gè) bool 值,指出元素是插入成功還是已存在于 dict 中,如果之前不存在,則返回true;如果先前已存在,則值為 false。

int main(void)
{
    map<string, int> dict{{"key1", 1}};  // 定義一個(gè) 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 的完整類(lèi)型如下:

pair<map<string, int>::iterator, bool>

但是!上面的 insert 方式還是麻煩了點(diǎn),不如直接使用文章開(kāi)頭說(shuō)的下標(biāo)操作!如果鍵 key 對(duì)還未出現(xiàn)在 dict 中,下標(biāo)運(yùn)算會(huì)創(chuàng)建一個(gè)新元素,其值默認(rèn)為 0 。

當(dāng)插入一個(gè)元素范圍時(shí),可以做如下操作,這時(shí)沒(méi)有返回值。

dict.insert(dict2.begin(), dict2.end());

5、刪除元素

map 有三個(gè)版本的 erase 操作,分別如下:

1、dict.erase(key)

從 dict 中刪除 鍵 為 key 的元素,返回刪除元素的數(shù)量,對(duì)于 map 類(lèi)型來(lái)說(shuō)為 1。

2、dict.erase(p)

從 dict 中刪除迭代器 p 指定的元素。p 必須指向 dict 中一個(gè)真實(shí)元素且不能等于 dict.end()。返回一個(gè)指向 p 之后的元素的迭代器。

3、dict.erase(b, e)

從 dict 中刪除迭代器 b 和 e 之間的元素,返回e。

int main(void)
{
    // 定義并初始化一個(gè) map 類(lèi)型數(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:

6、訪問(wèn)元素

map 提供了一些查找元素的操作如下:

1、dict.find(key)
// 返回一個(gè)迭代器 ,指向第一個(gè)鍵為 key 的元素,若 key 不存在于 dict 中,則返回 dict.end()
2、dict.count(key)
// 返回鍵為 key 的元素的數(shù)量,對(duì)于 map 來(lái)說(shuō),返回1
3、dict.lower_bound(key)
// 返回一個(gè)迭代器,指向第一個(gè)鍵不小于 key 的元素
4、dict.upper_bound(key)
// 返回一個(gè)迭代器,指向第一個(gè)鍵大于 key 的元素
5、dict.equal_range(key)
// 返回一個(gè)迭代器pair,表示關(guān)鍵字恩于 key 的元素的范圍。如果不存在,則pair的兩個(gè)成員均為
//dict.end()

一般來(lái)說(shuō),2~5的方法多用于 multimap 類(lèi)型的數(shù)據(jù)中。如果只是想查詢(xún)一個(gè)元素是否存在于 dict 中,則使用 find 是最好的選擇。

另外需要注意的是,如果使用下標(biāo)操作訪問(wèn)元素,如果該元素并不存在于 dict 中,則該操作會(huì)創(chuàng)建一個(gè)元素,因此,使用什么樣的訪問(wèn)方式需要根據(jù)我們的使用環(huán)境進(jìn)行選擇。

7、其他細(xì)節(jié)

map 是基于樹(shù)的結(jié)構(gòu)的,并且內(nèi)部元素是有序的,即是經(jīng)過(guò)鍵排序的:如果鍵的類(lèi)型是數(shù)字,則按照數(shù)字大小進(jìn)行排序,如果是 string,則按照字典序進(jìn)行排序。

總結(jié)

到此這篇關(guān)于C++中map、字典的基本使用的文章就介紹到這了,更多相關(guān)C++ map字典使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言二分法求解方程根的兩種方法

    C語(yǔ)言二分法求解方程根的兩種方法

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言二分法求解方程根的兩種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • delete[] p->elems和free(p->elems)區(qū)別介紹

    delete[] p->elems和free(p->elems)區(qū)別介紹

    delete[]和free()都是釋放內(nèi)存的函數(shù),但它們具有不同的使用方法和適用情況,這篇文章主要介紹了delete[] p->elems和free(p->elems)有什么區(qū)別,需要的朋友可以參考下
    2023-04-04
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之鏈隊(duì)列的基本操作

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之鏈隊(duì)列的基本操作

    這篇文章主要為大家介紹了C語(yǔ)言之鏈隊(duì)列的基本操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • C++ Boost Archive超詳細(xì)講解

    C++ Boost Archive超詳細(xì)講解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)
    2022-12-12
  • C++實(shí)現(xiàn)LeetCode(140.拆分詞句之二)

    C++實(shí)現(xiàn)LeetCode(140.拆分詞句之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(140.拆分詞句之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 淺析C/C++中動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建和調(diào)用

    淺析C/C++中動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建和調(diào)用

    下面小編就為大家?guī)?lái)一篇淺析C/C++中動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建和調(diào)用。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • c++ 數(shù)組定義及初始化詳解

    c++ 數(shù)組定義及初始化詳解

    這篇文章主要介紹了c++ 數(shù)組定義及初始化詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • C++瓦片地圖坐標(biāo)轉(zhuǎn)換的實(shí)現(xiàn)詳解

    C++瓦片地圖坐標(biāo)轉(zhuǎn)換的實(shí)現(xiàn)詳解

    常見(jiàn)的瓦片地圖有矩形、菱形、正六邊形幾種。此文章主要討論菱形瓦片,也就是大家常說(shuō)的2.5D,斜45度瓦片地圖。比如《紅警2》、《帝國(guó)時(shí)代2》都是采用這種技術(shù)
    2022-09-09
  • C++ 函數(shù)模板和類(lèi)模板詳情

    C++ 函數(shù)模板和類(lèi)模板詳情

    這篇文章主要對(duì)C++ 函數(shù)模板和類(lèi)模板的相關(guān)資料的詳細(xì)介紹,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-09-09
  • C++中線性代數(shù)計(jì)算Eigen庫(kù)的使用教程詳解

    C++中線性代數(shù)計(jì)算Eigen庫(kù)的使用教程詳解

    Eigen是一個(gè)基于線性代數(shù)的C++模板庫(kù),主要用于矩陣、向量、數(shù)值求解和相關(guān)算法,本文主要為大家簡(jiǎn)單聊聊Eigen庫(kù)的使用,希望對(duì)大家有所幫助
    2023-12-12

最新評(píng)論

大兴区| 腾冲县| 石楼县| 武隆县| 湘西| 石景山区| 河池市| 集贤县| 惠州市| 镶黄旗| 高安市| 饶阳县| 霍林郭勒市| 大渡口区| 新野县| 乌鲁木齐县| 陇川县| 二手房| 东至县| 贵阳市| 达州市| 新乡市| 沈丘县| 黎城县| 弥勒县| 石首市| 名山县| 西华县| 平凉市| 香港 | 南开区| 新巴尔虎右旗| 禹城市| 财经| 五指山市| 公主岭市| 都兰县| 大姚县| 肃南| 吉林省| 崇阳县|