1. map
-
簡介:
map 是 C++ STL 中的關聯容器,儲存鍵值對(key-value pair),所有元素按 鍵值升序(或自定義排序)儲存。
-
主要特性:
-
底層實現:使用 紅黑樹 實現,提供了自動排序功能。
-
元素有序:插入元素後,按鍵值排序。
-
時間複雜度:插入、刪除、查詢:O(logn)(因為樹的深度為 O(logn) )。
-
記憶體佔用:較小(相比 unordered_map,紅黑樹的實現比雜湊表節省記憶體)。
-
迭代器:提供雙向迭代器,支援正向和反向遍歷。
-
-
常見用法:
-
儲存有序鍵值對。
-
查詢某個範圍內的鍵值。
-
-
舉一個例子
#include <map> #include <iostream> using namespace std; int main() { map<int, string> m; m[3] = "C"; m[1] = "A"; m[2] = "B"; // 遍歷輸出 cout << "map contents:\n"; for (auto it : m) { cout << it.first << ": " << it.second << endl; } // 查詢 auto it = m.find(2); // 返回指向鍵為2的迭代器 if (it != m.end()) { cout << "Found key 2: " << it->second << endl; } }
輸出如下:
2. unordered_map
-
簡介:
unordered_map 是 C++ STL 中的無序關聯容器,用於儲存鍵值對。其底層實現是 雜湊表。
-
主要特性:
-
底層實現:
-
使用雜湊表,元素儲存位置基於鍵的雜湊值。
-
元素無序:元素儲存順序與插入順序、鍵值大小無關。
-
時間複雜度:插入、刪除、查詢:平均 O(1),最壞 𝑂(𝑛)(當發生雜湊衝突時)。
-
記憶體佔用:較大(因為雜湊表需要額外的儲存空間)。
-
迭代器:提供單向迭代器,不支援反向遍歷。
-
-
常見用法:
-
快速查詢鍵值對。
-
當資料無序性無關緊要時使用。
-
-
舉一個例子
#include <unordered_map> #include <iostream> using namespace std; int main() { unordered_map<string, int> umap; umap["apple"] = 5; umap["banana"] = 2; umap["cherry"] = 7; // 遍歷輸出 cout << "unordered_map contents:\n"; for (auto it : umap) { cout << it.first << ": " << it.second << endl; } // 查詢 if (umap.find("banana") != umap.end()) { cout << "Found banana with count: " << umap["banana"] << endl; } }
輸出如下:
3. set
-
簡介:
set 是一種有序集合,儲存 唯一元素,並按 升序(或自定義排序) 排列。
-
主要特性:
-
底層實現:使用紅黑樹。
-
元素有序:元素按順序儲存,支援範圍查詢。
-
時間複雜度:插入、刪除、查詢:O(logn)。
-
迭代器:提供雙向迭代器,支援正向和反向遍歷。
-
-
常見用法:
-
儲存需要唯一的有序集合。
-
執行區間查詢。
-
-
舉一個例子
#include <set> #include <iostream> using namespace std; int main() { set<int> s = {3, 1, 4, 1, 5}; // 重複的1會被自動去除 s.insert(2); // 遍歷輸出 cout << "set contents:\n"; for (auto it : s) { cout << it << " "; } // 查詢 if (s.find(4) != s.end()) { cout << "\nFound 4 in set."; } }
輸出如下:
4. unordered_set
-
簡介:
unordered_set 是一種無序集合,儲存 唯一元素,其底層實現是雜湊表。 -
主要特性:
-
底層實現:使用雜湊表。
-
元素無序:元素儲存位置與插入順序無關。
-
時間複雜度:插入、刪除、查詢:平均 O(1),最壞 O(n)。
-
迭代器:提供單向迭代器,不支援反向遍歷。
-
-
常見用法:
-
儲存需要唯一的無序集合。
-
僅關心元素的存在性或快速查詢。
-
-
舉一個例子
#include <unordered_set> #include <iostream> using namespace std; int main() { unordered_set<int> uset = {3, 1, 4, 1, 5}; uset.insert(2); // 遍歷輸出 cout << "unordered_set contents:\n"; for (auto it : uset) { cout << it << " "; } // 查詢 if (uset.find(4) != uset.end()) { cout << "\nFound 4 in unordered_set."; } }
輸出如下: