当然可以!下面是《【C++】map 和 set 的使用》教学内容,适用于新手学习 STL 容器的入门教程、教学讲义、短视频解说或代码实战参考,内容简洁直观,涵盖核心概念、基本操作、常见坑点和应用示例。
🧭【C++】map 和 set 的使用详解
map
和set
是 C++ STL 中的经典关联式容器,底层使用 红黑树 实现,支持自动排序与高效查找。
🎯 一、容器简介
容器 | 作用 | 特点 |
---|---|---|
std::set | 存储不重复元素的集合 | 自动排序,基于键值 |
std::map | 存储键值对(key-value) | key 自动排序,value 可修改 |
默认排序依据
<
运算符,底层使用红黑树,支持 O(logN) 的插入、删除、查找。
🧪 二、set 使用举例
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> s;
s.insert(3);
s.insert(1);
s.insert(2);
s.insert(3); // 重复元素不会插入
for (int x : s)
cout << x << " "; // 输出:1 2 3
cout << "\n是否包含 2: " << (s.count(2) ? "是" : "否") << endl;
s.erase(2);
cout << "删除 2 后,剩下:";
for (int x : s) cout << x << " ";
}
常用函数:
函数 | 说明 |
---|---|
insert(x) | 插入元素 |
erase(x) | 删除元素 |
count(x) | 是否包含元素 x(返回 0 或 1) |
find(x) | 返回指向元素的迭代器或 end() |
size() | 返回元素个数 |
🧪 三、map 使用举例
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, int> age;
age["Tom"] = 18;
age["Alice"] = 22;
age["Bob"] = 20;
for (auto& p : age)
cout << p.first << ": " << p.second << endl;
if (age.count("Alice"))
cout << "Alice 的年龄是:" << age["Alice"] << endl;
age.erase("Tom");
cout << "删除 Tom 后 size = " << age.size() << endl;
}
常用函数:
函数 | 说明 |
---|---|
operator[] | 访问/插入键值对(注意:会自动创建 key) |
insert({key, val}) | 插入键值对 |
find(key) | 返回指向 key 的迭代器 |
count(key) | 是否存在某 key |
erase(key) | 删除某个键 |
size() | 获取键值对数量 |
⚠️ 四、注意事项与小贴士
set
不允许重复元素;若需重复,请用multiset
map[key]
如果key
不存在,会自动插入一个默认值- 默认排序使用
<
,如需自定义排序,可传入比较器(见下) unordered_map
和unordered_set
更快,但无序(底层哈希)
🧰 五、自定义排序示例
struct cmp {
bool operator()(const int& a, const int& b) const {
return a > b; // 降序
}
};
set<int, cmp> s; // 创建降序 set
map<string, int, greater<string>> m; // 创建降序 map
📦 六、工程实践:词频统计
#include <iostream>
#include <map>
#include <sstream>
using namespace std;
int main() {
string text = "apple orange banana apple apple orange";
map<string, int> freq;
string word;
istringstream iss(text);
while (iss >> word)
freq[word]++;
for (auto& [k, v] : freq)
cout << k << ": " << v << endl;
}
输出:
apple: 3
banana: 1
orange: 2
🔍 七、map/set 与 unordered_map/unordered_set 区别
特性 | map/set | unordered_map/set |
---|---|---|
底层结构 | 红黑树 | 哈希表 |
是否有序 | ✅有序(按 key 排序) | ❌无序 |
插入查找复杂度 | O(logN) | O(1) 平均 |
支持自定义排序 | ✅ | ❌(仅哈希函数) |
📚 八、本章总结
内容 | 要点 |
---|---|
set | 自动去重、排序的集合容器 |
map | 自动按 key 排序的键值对集合 |
常用操作 | 插入、删除、查找、遍历 |
工程意义 | 查找/存储/计数等场景极为常用 |
拓展学习 | 自定义排序、多重容器、哈希版 unordered_map/set |
如果你需要我为这章整理一份:
- Markdown 教学文档
- PPT 图解讲义
- 视频解说稿 + 演示代码
map
和set
的面试题实战指南
发表回复