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 ----------------------------------------------------------
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END