国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu)

這篇具有很好參考價值的文章主要介紹了【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??博主CSDN主頁:杭電碼農(nóng)-NEO??
?
?專欄分類:C++從入門到精通?
?
??代碼倉庫:NEO的學(xué)習(xí)日記??
?
??關(guān)注我??帶你學(xué)習(xí)C++
? ????


【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)

1. 前言

在學(xué)習(xí)了二叉搜索樹后,現(xiàn)在
就可以來學(xué)習(xí)map和set了,雖然
它們的底層是紅黑樹結(jié)構(gòu),但是紅黑樹
的本質(zhì)也是一顆二叉搜索樹!

本質(zhì)重點(diǎn):

本篇文章著重講解map和set的
使用方法以及一些特性,以及講解
muti為前綴的map/set和普通map/set
的區(qū)別,其中會學(xué)到一個重要的結(jié)構(gòu)
pair,它會伴隨我們很久


2. map和set介紹

set是key模型,本質(zhì)是確定一個
元素在不在此容器中,也就是說
set中存儲的是一個單一數(shù)據(jù)

map和set的區(qū)別就是,map中存儲
的并不是一個單一數(shù)據(jù),而是存儲了
一個pair結(jié)構(gòu)!(后面會講解)

【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)
【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)

map的模板參數(shù)中有key和T
而set的模板參數(shù)只有T

set和map結(jié)構(gòu)中遍歷出來是
數(shù)據(jù)有序并且去重的!

map和set都只支持增刪查,不支持改!


3. pair結(jié)構(gòu)介紹

pair結(jié)構(gòu)實(shí)際上是一個鍵值對
以下是對于鍵值對的介紹:

【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)

這個類的代碼大概是這樣的:

template <class T1, class T2>
struct pair
{
	T1 first;
	T2 second;
	pair(): first(T1()), second(T2())
	{}
	pair(const T1& a, const T2& b): first(a), second(b)
	{}
};

它實(shí)際上就是封裝了兩個可以是不同
類型的數(shù),它可以用作中英字典,存儲
pair<string,string>的結(jié)構(gòu),first存儲中文
second存儲對應(yīng)的英文解釋,非常好用!

map中存儲的就是pair結(jié)構(gòu),所以
map也叫存儲的KV模型,因?yàn)閒irst和
second對應(yīng)key和value

map的三種常見使用方法:

1. 方法一: 定義pair對象后插入

map<string,string> dict;
pair<string,string> kv1("排序","sort");
pair<string,string> kv2("左邊","left");
dict.insert(kv1);
dict.insert(kv2);

2. 方法二: 使用匿名對象插入

map<string,string> dict;
dict.insert(pair<string,string>("排序","sort"));
dict.insert(pair<string,string>("左邊","left"));

3. 方法三: 使用make_pair插入

map<string,string> dict;
dict.insert(make_pair("排序","sort"));
dict.insert(make_pair("左邊","left"));

make_pair是最好用的方法!


4. set結(jié)構(gòu)詳解

【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)

先看set的第二個模板參數(shù)是less
是不是很熟悉?set默認(rèn)情況下遍歷
出來是升序,但是如果定義對象時顯示
傳參greater,就是降序!

set<int,greater<int>> s;

set的插入函數(shù)insert
【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)

插入我們需要關(guān)心三點(diǎn):
一是插入可以不用寫pos,直接插入
二是可以插入一段迭代器區(qū)間
三是插入的返回值也是一個pair結(jié)構(gòu)
pair中存儲了布爾類型和迭代器,分別
代表此次插入是否成功,若成功則返回
被插入元素迭代器的位置

set的查找和刪除函數(shù)find,erase
【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)

【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)


5. map結(jié)構(gòu)詳解

【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)

set是沒有支持方括號的
而map支持了,所以先講解方括號的使用

map的方括號用法:
先看文檔:
【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)
【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)

map的方括號設(shè)計(jì)的十分巧妙
它的參數(shù)的pair中的first,返回值
是pair中的second,并且它返回的是
引用,可以根據(jù)first修改second
它可以用來計(jì)數(shù),請看如下demo代碼:

統(tǒng)計(jì)水果的數(shù)量:

string arr[]={"蘋果","西瓜","香蕉","蘋果","西瓜","西瓜","西瓜","蘋果"};
map<string,int> countmap;
for(auto str : arr)
{
	countmap[str]++;
}

請?jiān)倏次臋n的詳細(xì)信息:

【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)

也就是說,方括號自帶插入功能,當(dāng)
出現(xiàn)第一個"西瓜"時,會自動把"西瓜"
插入到map中,第二次遇見"西瓜"時,
會將西瓜的計(jì)數(shù)++變成2

map的刪除和查找:
由于map的插入在前面已經(jīng)講解過了
這里只講解刪除和查找

【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)
【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)

erase和find傳參只用傳pair中的first
類型的參數(shù),即可完成任務(wù),并且find的
返回值和set的find是一樣的,一個意思


6. multimap和multiset

map和set的遍歷是有序并且去重的
也就是說里面沒有相同的元素,但是
STL提供了multimap和multiset
它們允許存在相同的元素!

【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)
【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)

由于支持元素冗余
所以multimap不支持方括號了!

當(dāng)我們插入相同的數(shù)據(jù)時,它也會保存

【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)


7. map和set實(shí)戰(zhàn)演練

請看下面的力扣題目:

【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)

力扣692題

大家先思考一下對策吧

題目解析:

本題目不僅僅要找出前k個高頻的單詞
并且還要按照字典序來排序,也就是說,
要滿足兩個排序的條件:字符串出現(xiàn)的次數(shù)
和字符串在字典中的順序!

想到要計(jì)數(shù),當(dāng)然是用map啦!

map<string,int> mpcount;
for(auto str : words)
	mpcount[str]++;

兩個細(xì)節(jié)問題以及結(jié)論

  • map計(jì)數(shù)后,只需以map中的second
    作為基準(zhǔn)來排序即可得到前k個高頻

  • map本身的遍歷就是有序的,并且此
    順序剛好是字典序(以first排序的)

結(jié)論:只需使用一個排序算法,在不打亂
map原本排序的情況下,以map中的
second為基準(zhǔn)排個序,即可得到我們
想要的答案,所以關(guān)鍵是要使用穩(wěn)定
的排序算法!

庫中穩(wěn)定的排序算法:stable_sort

【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu),C++從入門到精通,c++,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)

下面是所有的代碼,不懂可以私信我

class Solution {
public:
    struct _compare
    {
        bool operator()(pair<string,int> p1,pair<string,int> p2)
        {
            return p1.second>p2.second;
        }
    };
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string,int> mpcount;
        for(auto str : words)
            mpcount[str]++;
        vector<pair<string,int>> tmp;
        auto it = mpcount.begin();
        while(it!=mpcount.end())
        {
            tmp.push_back(*it);
            it++;
        }
        _compare com;
        vector<string> ret;
        stable_sort(tmp.begin(),tmp.end(),com);
        for(int i=0;i<k;i++)
            ret.push_back(tmp[i].first);
        return ret;
    }
};

8. 總結(jié)

熟悉map和set的使用在平常做題
時會有大用處,雖然平時用的更多的
是unordered_map/set,但是它們的
使用方法基本一致,學(xué)到就是賺到!文章來源地址http://www.zghlxwxcb.cn/news/detail-754635.html


?? 下期預(yù)告:AVL樹深度剖析 ??

到了這里,關(guān)于【C++高階(二)】熟悉STL中的map和set --了解KV模型和pair結(jié)構(gòu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++高級編程——STL:list容器、set容器和map容器

    本專欄記錄C++學(xué)習(xí)過程包括C++基礎(chǔ)以及數(shù)據(jù)結(jié)構(gòu)和算法,其中第一部分計(jì)劃時間一個月,主要跟著黑馬視頻教程,學(xué)習(xí)路線如下, 不定時更新,歡迎關(guān)注 。 當(dāng)前章節(jié)處于: ---------第1階段-C++基礎(chǔ)入門 ---------第2階段實(shí)戰(zhàn)-通訊錄管理系統(tǒng), ---------第3階段-C++核心編程, -----

    2024年01月25日
    瀏覽(23)
  • 【C++】STL——用一顆紅黑樹封裝出map和set

    【C++】STL——用一顆紅黑樹封裝出map和set

    我們都知道set是K模型的容器,而map是KV模型的容器,但是它倆的底層都是用紅黑樹實(shí)現(xiàn)的,上篇博文中我們模擬實(shí)現(xiàn)了一顆紅黑樹,接下來將對其進(jìn)行改造,繼而用一顆紅黑樹封裝出map和set。 本質(zhì)上map和set其內(nèi)部的主要功能都是套用了紅黑樹現(xiàn)成的接口,只是稍作改動即可

    2023年04月15日
    瀏覽(18)
  • C++:stl中set(multiset)和map(multimap)的介紹和使用

    C++:stl中set(multiset)和map(multimap)的介紹和使用

    本文主要從概念、常用接口和使用方法方面介紹set(multiset)和map(multimap)。 目錄 一、概念介紹 1.關(guān)聯(lián)式容器 2.鍵值對 3. 樹形結(jié)構(gòu)的關(guān)聯(lián)式容器 二、set和multiset 1.set的介紹 2.set使用 1. set模板參數(shù)列表 2. set構(gòu)造 3. set迭代器 4. set容量 5. set修改操作 6.set使用舉例 3.multiset介紹 4.mul

    2024年02月08日
    瀏覽(25)
  • 【C++練級之路】【Lv.17】【STL】set類和map類的模擬實(shí)現(xiàn)

    【C++練級之路】【Lv.17】【STL】set類和map類的模擬實(shí)現(xiàn)

    快樂的流暢:個人主頁 個人專欄:《C語言》《數(shù)據(jù)結(jié)構(gòu)世界》《進(jìn)擊的C++》 遠(yuǎn)方有一堆篝火,在為久候之人燃燒! STL庫中的set類和map類,其底層原理都是 通過紅黑樹來實(shí)現(xiàn) 的。盡管set和map可以各自實(shí)現(xiàn)一棵紅黑樹,但是為了提高代碼的復(fù)用率,STL庫中將紅黑樹進(jìn)行了一定

    2024年04月16日
    瀏覽(30)
  • 【C++進(jìn)階04】STL中map、set、multimap、multiset的介紹及使用

    【C++進(jìn)階04】STL中map、set、multimap、multiset的介紹及使用

    vector/list/deque… 這些容器統(tǒng)稱為 序列式容器 因?yàn)槠涞讓訛榫€性序列的數(shù)據(jù)結(jié)構(gòu) 里面存儲的是元素本身 map/set… 這些容器統(tǒng)稱為 關(guān)聯(lián)式容器 關(guān)聯(lián)式容器也是用來存儲數(shù)據(jù)的 與序列式容器不同的是 其里面存儲的是key, value結(jié)構(gòu)的鍵值對 在數(shù)據(jù)檢索時比序列式容器效率更高 “鍵

    2024年02月03日
    瀏覽(24)
  • 【C++入門到精通】哈希 (STL) _ unordered_map _ unordered_set [ C++入門 ]

    【C++入門到精通】哈希 (STL) _ unordered_map _ unordered_set [ C++入門 ]

    歡迎各位大佬們的關(guān)顧,本文將介紹unordered系列容器以及其中的兩個重要成員: unordered_map 和 unordered_set 。unordered_map是一種無序的關(guān)聯(lián)容器,它使用哈希表來存儲鍵值對,并提供高效的插入、查找和刪除操作。在本文中,我們將首先介紹unordered_map的基本概念和特點(diǎn),然后詳

    2024年02月08日
    瀏覽(20)
  • 【C++】STL——用一個哈希表封裝出unordered_map和unordered_set

    【C++】STL——用一個哈希表封裝出unordered_map和unordered_set

    根據(jù)先前對unordered_map和unordered_set的學(xué)習(xí),我們得知其底層是借助哈希表來實(shí)現(xiàn)的,接下來我們會使用上篇博客實(shí)現(xiàn)的開散列哈希表來模擬實(shí)現(xiàn)unordered_map和unordered_set,哈希表源代碼鏈接: Hash/Hash/HashBucket.h · wei/cplusplus - 碼云 - 開源中國 (gitee.com) 下面我們對哈希表進(jìn)行改造,

    2023年04月18日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】C++的STL模板(迭代器iterator、容器vector、隊(duì)列queue、集合set、映射map)以及算法例題

    【數(shù)據(jù)結(jié)構(gòu)與算法】C++的STL模板(迭代器iterator、容器vector、隊(duì)列queue、集合set、映射map)以及算法例題

    更多算法例題鏈接: 【數(shù)據(jù)結(jié)構(gòu)與算法】遞推法和遞歸法解題(遞歸遞推算法典型例題) 什么是迭代器(iterator) 迭代器(iterator)的定義: 迭代器是一種檢查容器內(nèi)元素并遍歷元素的數(shù)據(jù)類型。 迭代器提供對一個容器中的對象的訪問方法,并且定義了容器中對象的范圍。 容器

    2024年04月14日
    瀏覽(31)
  • 【高階數(shù)據(jù)結(jié)構(gòu)】封裝Map和Set

    【高階數(shù)據(jù)結(jié)構(gòu)】封裝Map和Set

    (???(??? )??,我是 Scort 目前狀態(tài):大三非科班啃C++中 ??博客主頁:張小姐的貓~江湖背景 快上車??,握好方向盤跟我有一起打天下嘞! 送給自己的一句雞湯??: ??真正的大師永遠(yuǎn)懷著一顆學(xué)徒的心 作者水平很有限,如果發(fā)現(xiàn)錯誤,可在評論區(qū)指正,感謝?? ????

    2024年01月20日
    瀏覽(28)
  • 【高階數(shù)據(jù)結(jié)構(gòu)】Map 和 Set(詳解)

    【高階數(shù)據(jù)結(jié)構(gòu)】Map 和 Set(詳解)

    (???(??? )??,我是 Scort 目前狀態(tài):大三非科班啃C++中 ??博客主頁:張小姐的貓~江湖背景 快上車??,握好方向盤跟我有一起打天下嘞! 送給自己的一句雞湯??: ??真正的大師永遠(yuǎn)懷著一顆學(xué)徒的心 作者水平很有限,如果發(fā)現(xiàn)錯誤,可在評論區(qū)指正,感謝?? ????

    2024年01月23日
    瀏覽(59)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包