## 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 = {} ```