C++中不得不說(shuō)的map容器
前言
為什么這兩天在研究C++的容器呢,因?yàn)樗㈩}的時(shí)候碰見了幾個(gè)不擅長(zhǎng)的題,得用STL中的幾種容器才能解出來(lái),所以也是動(dòng)力滿滿呀,希望能盡快轉(zhuǎn)過(guò)頭去把那幾個(gè)題給寫出來(lái),哈哈哈,當(dāng)然,解題思路和過(guò)程后續(xù)我也會(huì)分享出來(lái)。話不多說(shuō),老規(guī)矩,
使用map容器要包含頭文件#include<map>
1,map基本概念
簡(jiǎn)介:
map中所有元素都是pair(成對(duì)出現(xiàn)的數(shù))
pair中第一個(gè)元素為key(鍵值),起到索引的作用,第二個(gè)元素為value(實(shí)值)
所有的元素都會(huì)根據(jù)元素的鍵值自動(dòng)排序
本質(zhì):
map/multimap屬于關(guān)聯(lián)式容器,底層結(jié)構(gòu)是用二叉樹實(shí)現(xiàn)的
優(yōu)點(diǎn):
可以根據(jù)key值快速找到value值
map和multimap的區(qū)別:
map不允許容器中有重復(fù)的key值元素
multimap允許容器中有重復(fù)的key值元素
2,map構(gòu)造和賦值
功能描述:
對(duì)map容器進(jìn)行構(gòu)造和賦值操作
代碼實(shí)現(xiàn):
#include<iostream>
#include<map>
using namespace std;
void printMap(map<int, int>& m)
{
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
cout << "key=" << (*it).first << " value=" << (*it).second << endl;
}
cout << endl;
}
void test01()
{
//創(chuàng)建map容器 1,默認(rèn)構(gòu)造
map<int, int>m; //要寫兩個(gè)數(shù)據(jù)類型
m.insert(pair<int, int>(1, 10));
m.insert(pair<int, int>(3, 30)); //與插入的順序無(wú)關(guān)
m.insert(pair<int, int>(2, 20)); //容器會(huì)根據(jù)key值進(jìn)行自動(dòng)排序
m.insert(pair<int, int>(4, 40));
printMap(m);
//2,拷貝構(gòu)造
map<int, int>m2(m);
printMap(m2);
//3,賦值
map<int, int>m3;
m3 = m2; //等號(hào)方式賦值
printMap(m3);
}
int main() {
test01();
return 0;
}3,大小和交換
功能描述:
統(tǒng)計(jì)map容器大小以及交換map容器
函數(shù)原型:
size(); //返回容器中元素的個(gè)數(shù)
empty(); //bool類型,判斷容器是否為空
swap(st); //交換兩個(gè)集合容器
4,插入和刪除
功能描述:
map容器進(jìn)行插入和刪除數(shù)據(jù)
代碼實(shí)現(xiàn):
#include<iostream>
#include<map>
using namespace std;
void test01()
{
map<int, int>m;
//第一種插入
m.insert(pair<int, int>(1, 10));
//第二種插入
m.insert(make_pair(2, 20)); //不用寫模板參數(shù)
//第三種插入
m.insert(map<int, int>::value_type(3, 30));
//第四種插入
m[4] = 40;
//第一種刪除
m.erase(m.begin()); //參數(shù)為迭代器
//第二種刪除
m.erase(1); //按照key刪除
//第三種刪除
m.erase(m.begin(), m.end()); //區(qū)間刪除
//第四種刪除
m.clear(); //全部刪除
}
int main() {
test01();
return 0;
}5,查找和統(tǒng)計(jì)
功能描述:
對(duì)map容器進(jìn)行查找數(shù)據(jù)以及統(tǒng)計(jì)數(shù)據(jù)
函數(shù)原型:
find(key);
/*查找key是否存在,若存在,返回該元素的迭代器;
若不存在,返回end()迭代器*/
count(key); // 統(tǒng)計(jì)key的元素個(gè)數(shù)
/*map不允許插入重復(fù)key值,count統(tǒng)計(jì)結(jié)果要么是0,要么是1
multimap的count統(tǒng)計(jì)結(jié)果可能大于1*/
6,排序
map容器默認(rèn)的排序方式是,按照key值進(jìn)行從小到大的排序,但是我們可以利用仿函數(shù)實(shí)現(xiàn)從大到小排序,話不多說(shuō),直接上代碼
#include<iostream>
#include<map>
using namespace std;
class MyCompare
{
public:
bool operator()(int v1,int v2)const
{
return v1 > v2; //降序
}
};
void test01()
{
map<int, int, MyCompare>m; //加入仿函數(shù)
m.insert(make_pair(1, 10));
m.insert(make_pair(2, 20));
m.insert(make_pair(3, 30));
m.insert(make_pair(4, 40));
for (map<int, int,MyCompare>::iterator it = m.begin(); it != m.end(); it++) {//輸出的時(shí)候別忘了加上
cout << "key=" << it->first << " value=" << it-> second << endl;
}
}
int main() {
test01();
return 0;
}另外,對(duì)于自定義數(shù)據(jù)類型,map必須要指定排序規(guī)則。
總結(jié)
到此這篇關(guān)于C++中不得不說(shuō)的map容器的文章就介紹到這了,更多相關(guān)C++ map容器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenCV實(shí)現(xiàn)輪廓的發(fā)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了OpenCV如何實(shí)現(xiàn)輪廓的發(fā)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
C語(yǔ)言用棧和隊(duì)列實(shí)現(xiàn)的回文檢測(cè)功能示例
這篇文章主要介紹了C語(yǔ)言用棧和隊(duì)列實(shí)現(xiàn)的回文檢測(cè)功能,結(jié)合具體實(shí)例形式分析了C語(yǔ)言棧和隊(duì)列的定義及使用棧和隊(duì)列進(jìn)行回文檢測(cè)的操作技巧,需要的朋友可以參考下2017-06-06
C語(yǔ)言開發(fā)實(shí)現(xiàn)貪吃蛇游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言開發(fā)實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
詳解QTreeWidget隱藏節(jié)點(diǎn)的兩種方式
本文主要介紹了QTreeWidget隱藏節(jié)點(diǎn)的兩種方式,一種是直接隱藏,一種是間接隱藏,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C++學(xué)習(xí)貝葉斯分類器實(shí)現(xiàn)手寫數(shù)字識(shí)別示例解析
這篇文章主要介紹了在C++學(xué)習(xí)中如何采用貝葉斯分類器來(lái)實(shí)現(xiàn)手寫數(shù)字識(shí)別的示例及解析有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10
VC程序在Win32環(huán)境下動(dòng)態(tài)鏈接庫(kù)(DLL)編程原理
這篇文章主要介紹了VC程序在Win32環(huán)境下動(dòng)態(tài)鏈接庫(kù)(DLL)編程原理,包括了dll文件的原理與具體實(shí)現(xiàn)過(guò)程,對(duì)于深入掌握VC程序設(shè)計(jì)具有很好的參考借鑒價(jià)值,需要的朋友可以參考下2014-10-10
C語(yǔ)言實(shí)現(xiàn)繪制貝塞爾曲線的函數(shù)
貝塞爾曲線,又稱貝茲曲線或貝濟(jì)埃曲線,是應(yīng)用于二維圖形應(yīng)用程序的數(shù)學(xué)曲線。本文將利用C語(yǔ)言實(shí)現(xiàn)繪制貝塞爾曲線的函數(shù),需要的可以參考一下2022-12-12

