map、unordered_map、set 和 unordered_set的小介绍
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."; } }
输出如下: