set

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\n", 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("\n");
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("\n");
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。

posted @ 2018-02-03 19:00  mrclr  阅读(493)  评论(0编辑  收藏  举报