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)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程