《算法筆記》學習筆記
map 常見用法詳解
**map翻譯為映射,也是常用的STL容器 **
map可以將任何基本類型(包括STL容器)映射到任何基本類型(包括STL容器)
1. map 的定義
//單獨定義一個map
map<typename1, typename2> mp;
//map和其他的STL容器在定義上有點不同
//因為 map 需要確定映射前類型(鍵key)和映射后類型(值value)
//其中第一個是鍵的類型,第二個是值的類型
//字符串到整型的映射
//必須使用string而不能用char數組
map<string, int> mp;
//map的鍵和值也可以是STL容器
//將一個 set 容器映射到一個字符串
map<set<int>, string> mp;
2. map 容器內元素訪問
//map 一般有兩種訪問方式:通過下標或迭代器訪問
(1) 通過下標訪問
//和訪問普通的數組是一樣的
//注意:map中的鍵是唯一的
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['c'] = 20;
mp['c'] = 30; //20被覆蓋
printf("%d\n", mp['c']);
return 0;
}
(2) 通過迭代器訪問
//map 迭代器的定義和其他STL容器迭代器定義的方式相同
map<typename1, typename2>::iterator it;
//typename1和typename2就是定義map填寫時的類型
//map的每一對映射都有兩個typename,這決定了必須能通過一個 it 來同時訪問鍵和值。
//map 可以使用 it->first 來訪問鍵, it->second 來訪問值。
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['m'] = 20;
mp['r'] = 30;
mp['a'] = 40;
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
printf("%c %d\n", it -> first, it -> second);
}
return 0;
}
3. map常用函數實例解析
**(1) find() **
//find(key)返回鍵為key的映射的迭代器,時間復雜度為O(logN),N為map中映射的個數
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
map<char, int>::iterator it = mp.find('b');
printf("%c %d\n", it -> first, it -> second);
return 0;
}
(2) erase()
//erase()有兩種用法:刪除單個元素,刪除一個區間內的所有元素
//<1> 刪除單個元素
//刪除單個元素有兩種方法:
//mp.erase(it), it為需要刪除的元素的迭代器,時間復雜度為O(1)
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
map<char, int>::iterator it = mp.find('b');
mp.erase(it); //刪除 b 2
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
printf("%c %d\n", it -> first, it -> second);
}
return 0;
}
//mp.erase(key), key為欲刪除的映射的鍵。時間復雜度為O(logN),N為map內元素的個數
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
mp.erase('b'); //刪除鍵為b的映射,即 b 2
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
printf("%c %d\n", it -> first, it -> second);
}
return 0;
}
//<2> 刪除一個區間內的所有元素
//mp.erase(first, last), 其中first為需要刪除的區間的起始迭代器,
//而last則為需要刪除的區間的末尾迭代器的下一個地址,也即為刪除左閉右開
//的區間[first, last)。時間復雜度為O(last - first)
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
mp<char, int>::iterator it = mp.find('b'); //令it指向鍵為b的映射
mp.erase(it. mp.end()); //刪除it之后的所有映射,即b 2和c 3
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
printf("%c %d\n", it -> first, it -> second);
}
return 0;
}
(3) size()
//size()用來獲取map中映射的對數,時間復雜度位O(1)
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['a'] = 10;
mp['b'] = 20;
mp['c'] = 30;
printf("%d\n", mp.size()); //3對映射
return 0;
}
(4) clear()
//clear()用來清空map中的所有元素,復雜度為O(N),其中N為map中元素的個數。
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
mp.clear(); //清空map
printf("%d\n", mp.size());
return 0;
}
4.map的常見用途
- 需要建立字符(或字符串)與整數之間映射的題目,使用map可以減少代碼量。
- 判斷大整數或者其他類型數據是否存在的題目,可以把map當作bool數組用。
- 字符串和字符串的映射也有可能會遇到。