C++ map是一種關(guān)聯(lián)容器,它可以存儲(chǔ)鍵值對(duì)的數(shù)據(jù)。map的特點(diǎn)是,它的鍵是唯一的,而且是按照一定的順序排列的。map的底層實(shí)現(xiàn)是紅黑樹(shù),所以它的插入、刪除、查找等操作的時(shí)間復(fù)雜度都是O(logn)。
要使用map,首先需要包含頭文件
#include <map>
#include <string>
#include <iostream>
using namespace std;
//聲明一個(gè)map對(duì)象,鍵是string類型,值是int類型
map<string, int> m;
接下來(lái),可以用以下幾種方式向map中添加數(shù)據(jù):
- 使用下標(biāo)運(yùn)算符[],如果鍵不存在,則會(huì)創(chuàng)建一個(gè)新的鍵值對(duì),并將值初始化為默認(rèn)值。如果鍵已經(jīng)存在,則會(huì)覆蓋原來(lái)的值。例如:
m["Alice"] = 100; //創(chuàng)建一個(gè)新的鍵值對(duì),鍵為"Alice",值為100
m["Bob"] = 200; //創(chuàng)建一個(gè)新的鍵值對(duì),鍵為"Bob",值為200
m["Alice"] = 300; //覆蓋原來(lái)的值,將"Alice"對(duì)應(yīng)的值改為300
- 使用insert()函數(shù),它可以接受一個(gè)pair對(duì)象或一個(gè)迭代器范圍作為參數(shù)。如果鍵不存在,則會(huì)插入一個(gè)新的鍵值對(duì)。如果鍵已經(jīng)存在,則不會(huì)做任何改變。例如:
m.insert(pair<string, int>("Charlie", 400)); //插入一個(gè)新的鍵值對(duì),鍵為"Charlie",值為400
m.insert(pair<string, int>("Alice", 500)); //不會(huì)改變?nèi)魏螙|西,因?yàn)?Alice"已經(jīng)存在
- 使用emplace()函數(shù),它可以直接傳遞鍵和值作為參數(shù),而不需要?jiǎng)?chuàng)建pair對(duì)象。它的效果和insert()函數(shù)相同。例如:
m.emplace("David", 600); //插入一個(gè)新的鍵值對(duì),鍵為"David",值為600
m.emplace("Bob", 700); //不會(huì)改變?nèi)魏螙|西,因?yàn)?Bob"已經(jīng)存在
要從map中刪除數(shù)據(jù),可以用以下幾種方式:
- 使用erase()函數(shù),它可以接受一個(gè)鍵或一個(gè)迭代器或一個(gè)迭代器范圍作為參數(shù)。它會(huì)刪除指定的鍵值對(duì),并返回被刪除的元素個(gè)數(shù)或者下一個(gè)有效的迭代器。例如:
m.erase("Alice"); //刪除"Alice"對(duì)應(yīng)的鍵值對(duì),并返回1
m.erase(m.begin()); //刪除第一個(gè)鍵值對(duì),并返回下一個(gè)有效的迭代器
m.erase(m.begin(), m.end()); //刪除所有的鍵值對(duì),并返回尾后迭代器
- 使用clear()函數(shù),它會(huì)清空整個(gè)map,使其變成空容器。
要從map中查找數(shù)據(jù),可以用以下幾種方式:
- 使用find()函數(shù),它可以接受一個(gè)鍵作為參數(shù),并返回指向該鍵對(duì)應(yīng)的元素的迭代器。如果沒(méi)有找到該鍵,則返回尾后迭代器。例如:
auto it = m.find("Bob"); //查找"Bob"對(duì)應(yīng)的元素,并返回指向它的迭代器
if (it != m.end()) {
cout << it->first << " " << it->second << endl; //輸出"Bob 200"
} else {
cout << "Not found." << endl; //輸出"Not found."
}
- 使用count()函數(shù),它可以接受一個(gè)鍵作為參數(shù),并返回該鍵在map中出現(xiàn)的次數(shù)。由于map中的鍵是唯一的,所以該函數(shù)只能返回0或1。例如:
int n = m.count("Charlie"); //查找"Charlie"在map中出現(xiàn)的次數(shù),并返回它
if (n == 1) {
cout << "Found." << endl; //輸出"Found."
} else {
cout << "Not found." << endl; //輸出"Not found."
}
- 使用下標(biāo)運(yùn)算符[],如果鍵存在,則返回對(duì)應(yīng)的值的引用。如果鍵不存在,則會(huì)創(chuàng)建一個(gè)新的鍵值對(duì),并將值初始化為默認(rèn)值,并返回該值的引用。例如:
int x = m["David"]; //查找"David"對(duì)應(yīng)的值,并返回它,此時(shí)x為600
int y = m["Eve"]; //查找"Eve"對(duì)應(yīng)的值,由于不存在,會(huì)創(chuàng)建一個(gè)新的鍵值對(duì),鍵為"Eve",值為0,并返回該值的引用,此時(shí)y為0
要遍歷map中的數(shù)據(jù),可以用以下幾種方式:
- 使用迭代器,可以用begin()和end()函數(shù)獲取map的首尾迭代器,然后用++運(yùn)算符逐個(gè)訪問(wèn)每個(gè)元素。每個(gè)元素是一個(gè)pair對(duì)象,可以用first和second成員訪問(wèn)鍵和值。例如:
for (auto it = m.begin(); it != m.end(); ++it) {
cout << it->first << " " << it->second << endl; //輸出每個(gè)鍵值對(duì)
}
- 使用范圍for循環(huán),可以直接遍歷map中的每個(gè)元素。每個(gè)元素是一個(gè)pair對(duì)象,可以用first和second成員訪問(wèn)鍵和值。例如:
for (auto p : m) {
cout << p.first << " " << p.second << endl; //輸出每個(gè)鍵值對(duì)
}
- 使用for_each算法,可以傳遞一個(gè)函數(shù)或者一個(gè)lambda表達(dá)式作為參數(shù),對(duì)map中的每個(gè)元素進(jìn)行操作。每個(gè)元素是一個(gè)pair對(duì)象,可以用first和second成員訪問(wèn)鍵和值。例如:
#include <algorithm>
//定義一個(gè)函數(shù),打印一個(gè)鍵值對(duì)
void print(pair<string, int> p) {
cout << p.first << " " << p.second << endl;
}
//使用for_each算法,傳遞print函數(shù)作為參數(shù)
for_each(m.begin(), m.end(), print);
//使用for_each算法,傳遞lambda表達(dá)式作為參數(shù)
for_each(m.begin(), m.end(), [](pair<string, int> p) {
cout << p.first << " " << p.second << endl;
});
以上就是C++ map的基本用法,希望對(duì)你有所幫助。
C++相關(guān)課程推薦 C++相關(guān)課程