如何从视频中智能提取PPT:告别手动截图的终极方案
2026/5/6 20:39:01
学完序列容器vector、list:vector 连续数组随机访问快;list 双向链表中间插删快。今天进入关联容器核心:set / multiset,底层红黑树。
[]访问,只能迭代器遍历#include <iostream> #include <set> using namespace std; int main() { // 1. 空集合 set<int> s1; // 2. 初始化列表 set<int> s2 = {5,2,8,2,3}; // 3. 拷贝构造 set<int> s3(s2); // 4. 区间构造 set<int> s4(s2.begin(), s2.end()); return 0; }存入
5,2,8,2,3后自动变成:2,3,5,8自动排序 + 去重
只能用迭代器 / 范围 for,不支持下标:
set<int> s = {5,2,8,3}; // 迭代器遍历 for(set<int>::iterator it = s.begin(); it != s.end(); ++it) { cout << *it << " "; } cout << endl; // C++11 范围for for(auto val : s) { cout << val << " "; }set<int> s; // 插入元素,自动排序去重 s.insert(10); s.insert(5); s.insert(10); // 重复无效 // 大小、判空 s.size(); s.empty(); // 查找元素 // 找到返回迭代器位置,没找到返回 s.end() set<int>::iterator it = s.find(5); // 删除 s.erase(it); // 按迭代器删 s.erase(10); // 按值删除 // 清空 s.clear();用法和 set 几乎完全一样,唯一区别:不去重
multiset<int> ms = {2,2,5,5,8}; // 保留所有重复,依然自动排序:2 2 5 5 8set 默认按<比较,自定义结构体必须重载小于号:
struct Person { int id; string name; // 重载 < bool operator<(const Person& p) const { return this->id < p.id; } };之后就可以直接set<Person>存储自动排序。
#include <iostream> #include <set> using namespace std; int main() { set<int> s; // 插入 s.insert(3); s.insert(1); s.insert(4); s.insert(1); // 重复,自动忽略 cout << "set 自动排序+去重:"; for(auto val : s) { cout << val << " "; } cout << endl; // 查找 auto it = s.find(3); if(it != s.end()) { cout << "找到元素:" << *it << endl; // 删除 s.erase(it); } cout << "删除后:"; for(auto val : s) cout << val << " "; return 0; }运行结果:
set 自动排序+去重:1 3 4 找到元素:3 删除后:1 49,5,7,5,3到 set,观察自动排序去重