当然可以!下面是《【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()获取键值对数量

⚠️ 四、注意事项与小贴士

  1. set 不允许重复元素;若需重复,请用 multiset
  2. map[key] 如果 key 不存在,会自动插入一个默认值
  3. 默认排序使用 <,如需自定义排序,可传入比较器(见下)
  4. 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/setunordered_map/set
底层结构红黑树哈希表
是否有序✅有序(按 key 排序)❌无序
插入查找复杂度O(logN)O(1) 平均
支持自定义排序❌(仅哈希函数)

📚 八、本章总结

内容要点
set自动去重、排序的集合容器
map自动按 key 排序的键值对集合
常用操作插入、删除、查找、遍历
工程意义查找/存储/计数等场景极为常用
拓展学习自定义排序、多重容器、哈希版 unordered_map/set

如果你需要我为这章整理一份:

  • Markdown 教学文档
  • PPT 图解讲义
  • 视频解说稿 + 演示代码
  • map 和 set 的面试题实战指南