## map
c++ 中的`map`是一種有序關聯容器,根據鍵值自動排序,並將每個key對應到一個唯一的value。
### 注意事項
- key and value:每個元素包含**一個key和一個對應的value**。
- sort:自動按鍵進行排序,預設是**升冪排序**。
- 不允許重複key:每個key在 map 中是**唯一**的,允許value重複
## 使用時機
1. 當有一個key對應到value時
2. 要排序過的key
:::success
#### 沒有排序的`map`: `unordered_map`
---
用法跟`map`幾乎一樣,只是少了排序功能而已
:::
## 程式碼區
### 1. 函式庫引入
```cpp=
#include <map>
```
### 2. 初始化
1. 基本定義
```cpp=
map<keyType, valueType>map_name;
```
- `keyType`、`valyeType`沒有限制鑰什麼資料型態,可以`int`、`char`、`vector`、`map`之類的
ex:
```cpp=
map<int, int>mp;
```
2. 定義陣列裡內容
```cpp=
// 1
map<char, int>mp({{'a', 1}, {'b', 2}, {'c', 3}});
// 2
map<char, int>mp = {{'a', 1}, {'b', 2}, {'c', 3}};
```
3. 複製全部陣列
```cpp=
// 1
map<char, int>mp1({{'a', 1}, {'b', 2}, {'c', 3}});
map<char, int>mp2 = mp1;
// 2
map<char, int>mp1({{'a', 1}, {'b', 2}, {'c', 3}});
map<char, int>mp2(mp1);
```
4. 複製部分陣列(運用[迭代器](###迭代器))
```cpp=
map<char, int>mp({{'a', 1}, {'b', 2}, {'c', 3}});
auto it = mp1.begin(); // 迭代器(iterator)
map<char, int>mp2(it, it+3); // mp1[0] ~ mp[2]
//mp2 = {{'a', 1}, {'b', 2}, {'c', 3}});
```
### 3. 存取陣列中元素
```cpp=
map<char, int>mp({{'a', 1}, {'b', 2}, {'c', 3}});
// 1(推薦)
for (auto p: mp)
cout << p.first << " " << p.second << endl;
// 2(盡量用auto 來代替,但建議只有迴圈跟迭代器這樣用,否則你的程式碼可讀性會變得很低)
for (map<char, int>p : mp)
cout << p.first << " " << p.second << endl;
```
#### 輸出
```shell=
a 1
b 2
c 3
```
### 4. 讀取陣列中元素
```cpp=
map<char, int>mp({{'a', 1}, {'b', 2}, {'c', 3}});
// 2(推薦,超好用的)
for (auto p : mp)
cout << p.first << " " << ; // 1 2 3
// 3(盡量用auto 來代替,但建議只有迴圈跟迭代器這樣用,否則你的程式碼可讀性會變得很低)
for (vector<int>v : vec)
cout << v << " "; // 1 2 3
```
### 5. 增減元素
1. 新增key(類似傳統陣列,只要是新增key都可以用,大推)
```cpp=
map<char, int>mp({{'a', 1}, {'b', 2}, {'c', 3}});
mp['d'] = 4; // mp = {{'a', 1}, {'b', 2}, {'c', 3}, {'d', 4}}
```
2. 新增key (只能使用在key沒有在map裡時)
```cpp=
// 1個
map<char, int>mp({{'a', 1}, {'b', 2}, {'c', 3}});;
mp.insert({'d', '4'}); // mp = {{'a', 1}, {'b', 2}, {'c', 3}, {'d', 4}}
//多個
map<char, int>mp1({{'a', 1}, {'b', 2}, {'c', 3}});
map<char, int>mp2({{'d', 4}, {'e', 5}, {'f', 6}});
mp1.insert(mp2);
//mp1 = {{'a', 1}, {'b', 2}, {'c', 3}, {'d', 4}, {'e', 5}, {'f', 6}}}
```
3. 刪除key
```cpp=
map<char, int>mp({{'a', 1}, {'b', 2}, {'c', 3}});
mp.erase({{'a', 1}, {'b', 2}, {'c', 3}}); //mp= {}
map<char, int>mp1({{'a', 1}, {'b', 2}, {'c', 3}});
map<char, int>mp2({{'b', 2}, {'c', 3}}{'d', 4});
mp1.erase(mp2);
//map1 = {{'a', 1}}
```
### 6. 迭代器
> 通常搭配迴圈以及條件式使用,也可以用來取某段陣列中的元素
```cpp=
map<char, int>mp({{'a', 1}, {'b', 2}, {'c', 3}});
//1. mp.begin() : 取第一個的前面一個(從第一開始)
cout << mp.begin();
//2. mp.end() : 0 取最後一個的後面一個(從第一開始)
cout << mp.end();
//3. mp.rbegin() : 取最後一個的後面一個(從最後一個開始)
cout << mp.rbegin();
//4. mp.rend() : 0 取第一個的前面一個(從最後一個開始)
cout << mp.rend();
```
### 7. 其他函式
1. 判斷長度 `.size()`
> 通常搭配`for`迴圈做使用,當最迴圈的中止條件
```cpp=
map<char, int>mp({{'a', 1}, {'b', 2}, {'c', 3}});
cout << mp.size(); // 3
```
2. 判斷是否為空 `.empty()`
> 通常搭配`if`、`while`之類的條件是做使用
```cpp=
map<char, int>mp({{'a', 1}, {'b', 2}, {'c', 3}});
cout << mp.empty(); // 0(false)
```
3. 清空map陣列
```cpp=
map<char, int>mp({{'a', 1}, {'b', 2}, {'c', 3}});
mp.clear() // mp = {}
```