博客 / 詳情

返回

[C++STL教程]4.map超強的容器,它終於來了!零基礎都能理解的入門教程

之前我們介紹過vector, queue, stack,他們都有一個共同的特點,就是都可以用線性表來模擬。今天我們來學習一個全新且高封裝性的容器:map

🎈 作者:Eriktse
🎈 簡介:19歲,211計算機在讀,現役ACM銀牌選手🏆力爭以通俗易懂的方式講解算法!❤️歡迎關注我,一起交流C++/Python算法。(優質好文持續更新中……)🚀
🎈 個人博客:www.eriktse.com

什麼是 map

std::map是C++標準庫中的一個容器,數據以<key, value>的形式存儲,也就是我們常説的“鍵值對”形式,且其“鍵值對”是有序的,也就是可以順序遍歷的。

這意味着一個key只能對應一個value,而一個value可能對應了多個key,其關係有點像高中學過的函數的關係。

map的底層一般實現為紅黑樹,這個僅作了解即可。搜索、移除和插入操作擁有log級別複雜度。

初始化 map

首先引入頭文件:

#include <map>

用以下代碼聲明一個空的map

map<int, string> mp;//聲明一個類型為<int, string>的map

注意這裏使用了string,也就需要引入頭文件#include <string>

插入數據

map有一個函數是insert(),支持將數據插入。時間複雜度O(logn),n為map中已有的數據個數。

mp.insert({0, "張三"});//插入一條數據

當然還有另外一種辦法來插入數據,就是直接賦值,像操作數組一樣操作map,但是這個map的下標可不是連續的,可以是任意符合條件的key

mp[2] = "李四";
//現在map中的數據:{0: "張三", 2: "李四"}

可能會有小夥伴疑惑,這裏沒有1的嗎?在這裏mapkey只要int類型即可,就算是負數都可以!

mp[-1] = "王五";
//mp = {-1: "王五", 0: "張三", 2: "李四"};

mp[-1] = "eriktse";
//mp = {-1: "eriktse", 0: "張三", 2: "李四"};

值得注意的是,value可覆蓋的,且這裏的key有序的,雖然我的-1這個key是後面加入的,但是卻排在了第一個,如果順序遍歷這個mp的話,{-1: "eriktse"}會是第一個被遍歷到的。後面會講到如何遍歷map

刪除數據 & 清空map

erase(key)方法:刪除key所對應的數據。時間複雜度O(logn)

clear()方法:清空整個map。

mp.earse(-1);
////mp = {0: "張三", 2: "李四"};

獲取map大小(元素個數)

size()方法:返回map的大小,是一個非負整數。

檢查容器是否無元素,即是否 begin() == end()

獲取map中的數據

直接像用數組一樣獲取就行了。

mp[key]表示map中這個key所對應的value

cout << mp[0] << '\n';//輸出: 張三

遍歷輸出map

遍歷map需要用到std::iterator迭代器,沒有接觸過的同學可能不太瞭解,可以先看代碼,或者用第二種方法。

方法一:迭代器法

void print(map<int, string> mp)
{
    cout << '{';
    for(map<int, string>::iterator it = mp.begin(); it != mp.end(); ++ it)
    {
        cout << i.first << ": " << "\"" << i.second << "\"";
        if(next(it) != mp.end())cout << ", ";//這裏的next(it)表示it的下一個位置,注意這裏不能用 + 1運算,會報錯
    }
    cout << '}';
}

在需要輸出map的地方調用print(mp)即可。

方法二:auto關鍵字

void print(map<int, string> mp)
{
    cout << '{';
    for(auto &i : mp)
    {
        cout << i.first << ": " << "\"" << i.second << "\"";
        if(i != *mp.rbegin())cout << ", ";
    }
    cout << '}';
}
關於auto關鍵字,在這篇文章末尾有簡單介紹:https://www.eriktse.com/algorithm/1051.html

判斷某個key是否存在

count(key)可以返回key出現的次數,但是在經典的map中一個key只能出現一次,所以當返回值為1時説明key存在,返回值為0説明key不存在。時間複雜度O(logn)

在容器multimap中一個key允許出現多次。

還可用find()函數判斷。

find(key)返回一個迭代器表示找到的數據項,當找不到時返回end()

if(mp.count(x))cout << "mp中存在key == x的項";
else cout << "mp中不存在key == x的項";

if(mp.find(x) != mp.end())cout << "mp中存在key == x的項";
else cout << "mp中不存在key == x的項";

swap方法

mp1.swap(mp2)方法:交換兩個map容器。

看下面這個例子:

map<int, string> mp1, mp2;//聲明一個類型為<int, string>的map
mp1.insert({0, "張三"});//插入一條數據
mp1[2] = "李四";
mp1[-1] = "eriktse";

mp2[5] = "A";
mp1.swap(mp2);
//print函數需要自己實現
print(mp1);//輸出: {5: "A"}

總結

map是C++中常用的stl之一,也是算法競賽中的常客,大家一定要牢牢記住map的用法、

🎈 本文由eriktse原創,創作不易,如果對您有幫助,歡迎小夥伴們點贊👍、收藏⭐、留言💬

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.