STL-set(ACM)
2023/6/11 18:23:01
本文主要是介绍STL-set(ACM),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.set只能insert()、erase(),没有push()等操作
2.插入的元素自动排序按从小到大的顺序排
3.不会插入相同的元素,已经插入了6,之后就不会再插入了
4.时间复杂度为 O(log n)
5.set不像vector那样可以用 v.begin() + 5使用,只能用++ it, -- it, ++ se.begin()来使用
重构函数
set<int> se; // 重构函数(默认) set<int> se(头地址,尾地址); // 地址 前闭后开
基本操作
se.insert(); // 插入元素 se.erase(); // 删除元素,既可以放地址也可以放要删除的元素 // 上面两个操作 O(log n) se.begin(); se.end(); se.count(); // 由于set中元素唯一,返回值只有1 或者 0 // 判断一个元素是否存在 se.find(); // 放入元素,返回要查找元素的迭代器,没有该元素返回se.end() // 例如 auto it = se.find(4); if (it == se.end()) puts("No Exist"); else puts("Exist"); lower_bound(); // 可以使用,不>= 的元素就返回se.end() upper_bound(); // 同上
迭代器遍历
for (int x : se) { cout << x << endl; } for (auto it = se.begin(); it != se.end(); it ++) { printf("%d\n", *it); }
取代堆的一部分功能
// 插入一个元素,输出最大的元素 prev(); // 括号内迭代器 - 1的位置,prev(se.end()) 最后一个元素的迭代器 cout << *prev(se.end()) << endl; // 输出set中最大的元素 se.erase(prev(se.end())); // 删除set中最大的元素 // 传统堆是不能修改某个元素 // 修改某个元素操作 // a[i] == x -> y se.erase(x); se.insert(y); // 完成
set也有缺点,元素都是去重后的,不过我们可以用pair改进
set<pair<int, int>> se; // se.first指权值,se.second指位置 // 权值相同的话通过位置来区分两个元素 vector<int> v{2, 4, 6, 1, 6}; set<pair<int, int>> se; for (int i = 0; i < v.size(); i ++) { se.insert(make_pair(v[i], i)); } for (pair<int, int> x : se) { cout << x.first << ' ' << x.second << endl; } // 类似这种用法,很迷,结果如下 1 3 2 0 4 1 6 2 6 4 ----------------------------------------------------------
这篇关于STL-set(ACM)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升