set 是一个内部有序的数据结构,支持添加,删除元素,但不支持修改元素(所以想修改,就要先删再添)。
别忘加上头文件 #include<set>
1.声明
和其他STL一样,set<int>s。 <> 内的是数据类型,后面的是名称。
2.插入元素
s.insert(5)。向 int 型 set 中插入了一个整数 5。
3.查找
s.find(5)。查找set中的5,一般这么写 if (s.find(6) == s.end()) ......,这意味着如果没找到 5,就执行下面的语句。
4.求 set 的大小
x = s.size()。注意的是,求出的 x 就是个数。如以下程序,输出的就是4
1 #include <bits/stdc++.h> 2 using namespace std; 3 set<int>s; 4 int main() 5 { 6 for(int i = 0; i < 4; i++) s.insert(i); 7 printf("%d ", s.size()); 8 return 0; 9 }
5.遍历
1 #include <bits/stdc++.h> 2 using namespace std; 3 set<int>s; 4 int main() 5 { 6 for (int i = 0; i < 4; i++) s.insert(i); 7 for(set<int>::iterator it = s.begin(); it != s.end(); it++) 8 printf("%d ", *it); 9 printf(" "); 10 return 0; 11 }
输出:0 1 2 3。it 可以理解为一个自己定义的指针,记住格式就好了。
6.删除
有两种方法,在 set 里面完全等效。(不过在 multiset 里就不一样了)
(1) s.erase(5); 将 5 删除。
(2) set<int>::iterator it = s.find(5); s.erase(it);
7.lower_bound 和 upper_bound
在 set 里面一样可以用,不过这么用:
1 #include <bits/stdc++.h> 2 using namespace std; 3 set<int>s; 4 int main() 5 { 6 for (int i = 0; i < 4; i++) s.insert(i); 7 set<int>::iterator it1 = s.lower_bound(2); printf("%d ", *it1); //lower_bound(2)是找到第一个大于等于2的数 8 set<int>::iterator it2 = s.upper_bound(2); printf("%d", *it2); //upper_bound(2)是找到第一个大于2的数 9 printf(" "); 10 return 0; 11 }
输出:2 3
划重点: set 可以去重,比如 inset(5) 操作了3次,但 set 里面就一个5。但 set 有一个弊端,就是没有下脚标,这样的话,就无法直接输出第 k 大(小)的数。
顺便再说一下 multiset
头文件也是 set。
multiset 与 set 的区别就是,它允许集合中存在相同的元素,大部分操作和 set 一样,只需要将 set 改成 multiset 即可。但有一点不同。就是删除操作。
还记得两种写法吗?
(1) s.erase(5); 只不过这是删除 multiset 中的所有5。
(2) set<int>::iterator it = s.find(3); s.erase(it); 而这只删除一个 5。