【c++】set和map
在 C++ 中,set
和 map
是标准模板库(STL)提供的关联容器,它们内部通常基于红黑树实现,具有自动排序和快速查找的特性。
set 容器
set
是一种集合容器,它存储唯一的元素,并且会自动对元素进行排序(默认升序)。
主要特点:
- 元素唯一,不允许重复
- 元素自动排序
- 插入、删除和查找操作的时间复杂度为 O (log n)
基本用法示例:
cpp
运行
#include <iostream>
#include <set>int main() {// 创建一个set容器,存储int类型std::set<int> mySet;// 插入元素mySet.insert(3);mySet.insert(1);mySet.insert(2);mySet.insert(2); // 重复元素,不会被插入// 遍历元素(会按升序输出)for (auto it = mySet.begin(); it != mySet.end(); ++it) {std::cout << *it << " ";}// 输出:1 2 3// 查找元素auto findIt = mySet.find(2);if (findIt != mySet.end()) {std::cout << "\n找到元素:" << *findIt << std::endl;}// 删除元素mySet.erase(2);return 0;
}
map 容器
map
是一种键值对容器,存储的是 key-value
对,其中键(key)是唯一的,并且会根据键自动排序。
主要特点:
- 存储键值对(key-value)
- 键唯一,值可以重复
- 按键自动排序
- 插入、删除和查找操作的时间复杂度为 O (log n)
基本用法示例:
cpp
运行
#include <iostream>
#include <map>
#include <string>int main() {// 创建一个map容器,键为int类型,值为string类型std::map<int, std::string> myMap;// 插入元素myMap.insert(std::make_pair(3, "张三"));myMap[1] = "李四"; // 另一种插入方式myMap[2] = "王五";// 遍历元素(会按键的升序输出)for (auto it = myMap.begin(); it != myMap.end(); ++it) {std::cout << "键:" << it->first << ",值:" << it->second << std::endl;}// 查找元素auto findIt = myMap.find(2);if (findIt != myMap.end()) {std::cout << "找到键为2的值:" << findIt->second << std::endl;}// 修改元素myMap[2] = "赵六";// 删除元素myMap.erase(1);return 0;
}
常用变种
multiset
:与set
类似,但允许元素重复multimap
:与map
类似,但允许键重复unordered_set
和unordered_map
:基于哈希表实现,不排序,但插入、删除和查找操作更快(平均 O (1))
选择使用 set
还是 map
,主要取决于是否需要存储键值对关系。如果只需要存储唯一元素并排序,用 set
;如果需要存储键值对,用 map
。