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"] = 17map基本操作
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實戰演練
先來題經典題
題目概述:
我們有兩個集合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)
馬上練習
善用STL題
MINGDAO CPP MAP講義
By Gilbert Yeh
MINGDAO CPP MAP講義
- 239