iT邦幫忙

1

【c++標準函式庫(STL)筆記】Map介紹

c++

哈囉~ 今天學習c++裡面的Map工具,
感覺蠻實用的,筆記一下

Map簡介

map裡面的元素存兩個值,
第一個稱為key,第二個稱為value,
在map中,可以透過key去查找value,
就像透過字典的詞條去查詢一個字的感覺一樣,
依小馬使用的感覺,
map非常類似於python語法的字典(dict)

map的優點是可以在O(log n)的時間做插入與查找,
插入與查找元素都很快速

一、引入函式庫

要使用map,需要在程式開頭加入這兩行

#include <map>
using namespace std;

二、宣告

map的宣告方式如下:

map<string, string> myMap;

宣告的同時初始化

若要在宣告map的同時初始化,
可以用大括號將元素包起來,例如
可以寫在同一行:

map<string, string> myMap = { {"s", "黑桃"}, {"d", "方塊"} };

如果元素多時,可以分多行來寫,看起來較清楚

map<string, string> myMap = 
{
    {"s", "黑桃"},
    {"d", "方塊"}, 
    {"h", "紅心"},
    {"c", "梅花"}
};

三、插入元素

有兩種方式,第一種是使用map的insert函數插入pair:

map<string, string> myMap;
myMap.insert(pair<string, string>("s", "黑桃"));

第二種方式是類似用陣列的方式插入,比較直觀:

map<string, string> myMap;
myMap["s"] = "黑桃";

四、查詢元素

可以直接像陣列使用中括號裡面放index查看元素內容
(map則是用key去查詢value的值)
範例:

#include <map>
#include <string>
#include <iostream>
using namespace std;

int main()
{
    map<string, string> myMap = { {"s", "黑桃"}, {"d", "方塊"} };
    cout << myMap["h"] << endl; //因為myMap還沒有key為"h"的元素,不印出東西
    cout << myMap["d"] << endl; //方塊
    return 0;
}

也可以用find函數查找,返回迭代器位置,
若找不到元素則返回end()位置
範例:

#include <map>
#include <string>
#include <iostream>
using namespace std;

int main()
{
    map<string, string> myMap = { {"s", "黑桃"}, {"d", "方塊"} };
    auto iter = myMap.find("d");
    if(iter != myMap.end())
        cout<<"key "<< iter->first << " 對應的value值為: "<<iter->second<<endl;
    else
        cout<<"找不到元素"<<endl;
    return 0;
}

五、遍歷元素

將整個map裡面的元素印出來:

#include <map>
#include <string>
#include <iostream>
using namespace std;

int main()
{
    map<string, string> myMap = 
    {
        {"s", "黑桃"},
        {"d", "方塊"}, 
        {"h", "紅心"},
        {"c", "梅花"}
    };
    for (auto it = myMap.begin(); it != myMap.end(); it++) {
        cout<<it->first<<" "<<it->second<<endl;
    }
    return 0;
}

結果為:
c 梅花
d 方塊
h 紅心
s 黑桃

六、刪除元素

刪除資料可以用erase()函數,
共有三種用法:

用迭代器刪除

auto iter = myMap.find("s");
myMap.erase(iter);

用關鍵字刪除

int n = myMap.erase("s");//如果刪除了會返回1,否則返回0

迭代器範圍刪除

myMap.erase(myMap.begin(), myMap.end()); //相當於myMap.clear(),清空元素

參考資料

  1. Mr. Opengate. C/C++ - Map (STL) 用法與心得完全攻略

尚未有邦友留言

立即登入留言