c++ Map

map映射

map裡的元素會按照key值排序

 

map其實就是把節點改成pair的set

 

所以map其實也是一棵紅黑樹喔!

 

好吧我們廢話不多說直接進入主題

map名詞介紹

map<int, int> mp;
mp[0] = 1;

第一個字稱為key(關鍵字),也就是範例中的 0

 

第二個字稱為value(值),範例中的 1

 

Map基本操作

map基本操作

map宣告

map<int,int> mii;
//int對應到int的map
map<string,int> msi;
//string對應到int的map
map<int,pair<int,int>> mp;
//基本上所有你想的到的資料型態
//都可以塞進去ex:stuct等等

map基本操作

map加入元素

 

跟set的insert原理一樣

 

複雜度都是O(log N) N是map大小

map<string,int> mp;
mp["loli"] = 12;
mp["jk"] = 16;
mp["jk"]++; // mp["jk"] = 17

map基本操作

map刪除元素

 

erase裡面可以放關鍵字(key)或是迭代器

 

複雜度也是O(log N)

map<string,int> mp;
mp["loli"] = 12;
mp["jk"] = 16;
s.erase("jk");
s.erase("loli");

map基本操作

map查找元素

不是直接用中括號下標就好了嗎?

不建議這麼做

 

mp["loli"] = 12;
if(mp.find("loli") != mp.end())
	cout << mp["loli"] << '\n';
//建議用法 優點 時間較快 不會增加多餘記憶體
if(mp["loli"])
	cout << mp["loli"] << '\n';
//不建議用法 缺點如果查找元素不再map中
//會多開出記憶體並把值設為0且時間較慢

map基本操作

用迴圈遍歷map

 

map<int,int> mp
for(int i = 1 ; i <= 10; i++)
  mp[10 - i] = i ;

for(auto i : mp)
  cout << i.first << ' ' << i.second << '\n';
//map裡面的元素對應關係其實就是用pair實做的
//first就是上迴圈裡的 10 - i部份
//second就是上迴圈的i部份
//map預設會按照first由小到大排序

map基本操作

清空map

 

map<int, int> mp;

mp.clear();

Map實戰演練

map實戰演練

先來題經典題

 

MDCPP JUDEGE 2-Set

 

題目概述:

 

我們有兩個集合A, B,A中有n個相異數字, B中有m個相異數字。而K是一個整數,請從A, B集合中各取一個數a, b,

問滿足a + b == k 的 (a, b) 有多少。

map實戰演練

思考:

暴力枚舉複雜度為O(n * m)顯然會超時

有沒有更好的方法?

 

我們先把A集合中所有數加入到map裡

然後遍歷B集合的每個元素

最後只要查詢k - b是否出現在map (b 為 B 集合中元素)

複雜度O(n log n)

 

PS : 如果改用hash_map可將時間壓縮到接近O(n)

馬上練習

Subarray Sum II

 

跟前一題作法類似

 

但會用到前綴和

 

PS : 如果不會出現負數的話可以使用two pointer

 

 

善用STL題

Good Sequence

 

我們想要開一個陣列紀錄對於每個數字X

 

他總共出現了幾次

 

但X最大道1e9沒辦法開陣列

 

那就用map吧

 

 

MINGDAO CPP MAP講義

By Gilbert Yeh

MINGDAO CPP MAP講義

  • 239