set本质上是一棵红黑树,用法也就那么几个,插入删除lowerbound,再就是迭代器之类的

基本用法

begin()--返回指向第一个元素的迭代器

  1. #include<cstdio>
  2. #include<set>
  3. int main()
  4. {
  5. std::set<int>s;
  6. s.insert();
  7. s.insert();
  8. s.insert();
  9. printf("%d",*s.begin());
  10. //输出4
  11. return ;
  12. }

begin()

end()--返回指向最后一个元素的迭代器

  1. #include<cstdio>
  2. #include<set>
  3. int main()
  4. {
  5. std::set<int>s;
  6. s.insert();
  7. s.insert();
  8. s.insert();
  9. printf("%d",*s.end());
  10. //注意这里的跌倒器指向的是一个空位置!
  11. //所以最好不要输出end()
  12.  
  13. //输出末尾元素可以用下面的方法
  14. //std::set<int>::iterator it=s.end();
  15. //printf("%d",*--it);
  16. return ;
  17. }

end()

rbegin()--返回指向集合中最后一个元素的反向迭代器

rend()--返回指向集合中第一个元素的反向迭代器

find()--返回一个指向被查找到元素的迭代器

insert()--在集合中插入元素

size()--集合中元素的数目

clear()--清除所有元素

  1. #include<cstdio>
  2. #include<set>
  3. int main()
  4. {
  5. std::set<int>s;
  6. s.insert();
  7. s.insert();
  8. s.insert();
  9. printf("%d\n",s.size());
  10. s.clear();
  11. printf("%d\n",s.size());
  12. return ;
  13. }

clear()

count()--返回某个值元素的个数//主要应用于multiset

  1. #include<cstdio>
  2. #include<set>
  3. int main()
  4. {
  5. std::multiset<int>s;
  6. s.insert();
  7. s.insert();
  8. s.insert();
  9. printf("%d",s.count());
  10. return ;
  11. }

count

empty()--如果集合为空,返回true

erase()--删除集合中的元素

erase可以删除给定的元素,也可以删除迭代器

在multiset中,删除给定的元素是全部删除,而删除迭代器只会删除一次,下面还会讲到

  1. #include<cstdio>
  2. #include<set>
  3. int main()
  4. {
  5. std::set<int>s;
  6. s.insert();
  7. s.insert();
  8. s.insert();
  9. s.erase();
  10. s.erase(s.find());
  11. if(s.find()==s.end()) printf("5 is not found\n");
  12. if(s.find()==s.end()) printf("4 is not found\n");
  13. if(s.find()!=s.end()) printf("6 is found");
  14. return ;
  15. }

erase()

lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器

  1. #include<cstdio>
  2. #include<set>
  3. int main()
  4. {
  5. std::set<int>s;
  6. s.insert();
  7. s.insert();
  8. s.insert();
  9. printf("%d",*s.lower_bound());
  10. //输出为4
  11. return ;
  12. }

lower_bound()

upper_bound()--返回大于某个值元素的迭代器

  1. #include<cstdio>
  2. #include<set>
  3. int main()
  4. {
  5. std::set<int>s;
  6. s.insert();
  7. s.insert();
  8. s.insert();
  9. printf("%d",*s.upper_bound());
  10. //输出为4
  11. return ;
  12. }

upper_bound()

swap()--交换两个集合变量

  1. #include<cstdio>
  2. #include<set>
  3. int main()
  4. {
  5. std::set<int>s;
  6. std::set<int>a;
  7. s.insert();
  8. s.insert();
  9. a.insert();
  10. s.swap(a);
  11. printf("%d",s.size());
  12. //输出为1
  13. return ;
  14. }

swap()

几个常用操作

正序遍历所有元素

这个需要借助迭代器来实现

set中是重载了迭代器的++和--运算符的,所以直接使用就可以了

  1. #include<cstdio>
  2. #include<set>
  3. #define sit set<int>::iterator
  4. using namespace std;
  5. int main()
  6. {
  7. set<int>s;
  8. for(int i=;i<=;i++)
  9. s.insert(i);
  10. for(sit i=s.begin();i!=s.end();i++)
  11. printf("%d ",*i);
  12. //输出1 2 3 4 5 6 7 8 9 10
  13. return ;
  14. }

倒序遍历所有元素

可以使用rbegin和rend实现,他们与begin和end的关系如下图所示

  1. #include<cstdio>
  2. #include<set>
  3. #define rsit set<int>::reverse_iterator
  4. using namespace std;
  5. int main()
  6. {
  7. set<int>s;
  8. for(int i=;i<=;i++)
  9. s.insert(i);
  10. rsit it=s.rbegin();
  11. for(rsit i=s.rbegin();i!=s.rend();i++)
  12. printf("%d ",*i);
  13. //输出10 9 8 7 6 5 4 3 2 1
  14. return ;
  15. }

multiset中删除元素

在multiset中,如果仅仅用erase($x$)来删除$x$元素,那么$x$的出现次数会变为$0$

解决方法是先找到$x$对应的迭代器,然后将迭代器删除,这样就可以使$x$只删除一次

  1. #include<cstdio>
  2. #include<set>
  3. #define sit set<int>::iterator
  4. using namespace std;
  5. int main()
  6. {
  7. multiset<int>s;
  8. s.insert();
  9. s.insert();
  10. s.insert();
  11. s.erase();
  12. printf("%d\n",s.count());
  13.  
  14. s.insert();
  15. s.insert();
  16. s.insert();
  17. s.erase(s.find());
  18. printf("%d\n",s.count());
  19. //输出0 2
  20. return ;
  21. }

自定义排序规则

如果元素不在结构体中,需要自定义结构体并重载“$()$”运算符

  1. #include<cstdio>
  2. #include<set>
  3. #define sit set<int>::iterator
  4. using namespace std;
  5. struct comp
  6. {
  7. bool operator ()(const int &a,const int &b)
  8. {
  9. return a>b;
  10. }
  11. };
  12. int main()
  13. {
  14. set<int,comp>s;
  15. for(int i=;i<=;i++)
  16. s.insert(i);
  17. for(sit i=s.begin();i!=s.end();i++)
  18. printf("%d ",*i);
  19. //输出10 9 8 7 6 5 4 3 2 1
  20. return ;
  21. }

若元素在结构体中,则需要重载$<$运算符

  1. #include<cstdio>
  2. #include<set>
  3. #define sit set<node>::iterator
  4. using namespace std;
  5. struct node
  6. {
  7. int l,r;
  8. node(int l=,int r=):l(l),r(r){};
  9. bool operator < (const node &a) const
  10. {
  11. return r==a.r?l<a.l:r<a.r;
  12. }
  13. };
  14. int main()
  15. {
  16. set<node>s;
  17. for(int i=;i<=;i++)
  18. s.insert(node(i,-i+));
  19. for(sit i=s.begin();i!=s.end();i++)
  20. printf("%d %d\n",i->l,i->r);
  21.  
  22. //输出
  23. /*
  24. 10 1
  25. 9 2
  26. 8 3
  27. 7 4
  28. 6 5
  29. 5 6
  30. 4 7
  31. 3 8
  32. 2 9
  33. 1 10
  34. */
  35. return ;
  36. }

在结构体中二分

只要重载了$<$,就可以在结构体中二分了

  1. #include<cstdio>
  2. #include<set>
  3. #define sit set<node>::iterator
  4. using namespace std;
  5. struct node
  6. {
  7. int l,r;
  8. node(int l=,int r=):l(l),r(r){};
  9. bool operator < (const node &a) const
  10. {
  11. return r==a.r?l<a.l:r<a.r;
  12. }
  13. };
  14. int main()
  15. {
  16. set<node>s;
  17. for(int i=;i<=;i++)
  18. s.insert(node(i,i));
  19. sit it=s.lower_bound(node(,));
  20. printf("%d %d",it->l,it->r);
  21.  
  22. //输出 2 2
  23. return ;
  24. }

题目

都是可以用set水的大水题

BZOJ2783

BZOJ2028

BZOJ1058

set用法小结的更多相关文章

  1. 转载:Hadoop排序工具用法小结

    本文转载自Silhouette的文章,原文地址:http://www.dreamingfish123.info/?p=1102 Hadoop排序工具用法小结 发表于 2014 年 8 月 25 日 由 ...

  2. [No000010]Ruby 中一些百分号(%)的用法小结

    #Ruby 中一些百分号(%)的用法小结 #这篇文章主要介绍了Ruby 中一些百分号(%)的用法小结,需要的朋友可以参考下 what_frank_said = "Hello!"#% ...

  3. C++ typedef用法小结 (※不能不看※)

    C++ typedef用法小结 (※不能不看※) 第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // 这多数不 ...

  4. 函数fgets和fputs、fread和fwrite、fscanf和fprintf用法小结 (转)

    函数fgets和fputs.fread和fwrite.fscanf和fprintf用法小结 字符串读写函数fgets和fputs 一.读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符 ...

  5. 1:CSS中一些@规则的用法小结 2: @media用法详解

    第一篇文章:@用法小结 第二篇文章:@media用法 第一篇文章:@用法小结 这篇文章主要介绍了CSS中一些@规则的用法小结,是CSS入门学习中的基础知识,需要的朋友可以参考下     at-rule ...

  6. 英语语法最终珍藏版笔记- 21it 用法小结

    it 用法小结 it 在英语中的意思较多,用法较广,现总结如下. 一.it作句子的真正主语 1.it 指前面已经提到过的人或事物,有时指心目中的或成为问题的人或事物,作真正主语. 例如: What’s ...

  7. [转]ssh常用用法小结

    ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...

  8. 结构体定义 typedef struct 用法详解和用法小结

    typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便.具体区别在于:若struct node {}这样来定义结构体的话.在申请node 的变量时,需要这样写,stru ...

  9. typedef用法小结

    typedef用法小结- - 注意:本文转自网络,版权归原作者所有. typedef typedef用法小结- - 这两天在看程序的时候,发现很多地方都用到typedef,在结构体定义,还有一些数组等 ...

  10. NSEnumerator用法小结

    NSEnumerator   3)枚举 (NSEnumerator)遍历数组每个索引处的对象,你可以编写一个0到[array count]的循环,而NSEnumerator用来描述这种集合迭代运算的方 ...

随机推荐

  1. Python-字典与json的转换

    #json是字符串,只不过长得像字典 import json user_info='''{"niuhy":1234,"shanbl":44566}''' #js ...

  2. http请求抓包神器-Fiddler(记录和检查你电脑的所有http通讯)

    Fiddler是做什么的,能帮助我们做什么? 1.能够监听http/httpS的流量,可以截获从浏览器或者客户端软件向服务器发送的http/https请求: 2.对截获之后的请求,我们还能够查看请求中 ...

  3. [Swift]LeetCode128. 最长连续序列 | Longest Consecutive Sequence

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. Y ...

  4. MyBatis增、删、改、查

    1.config.xml文件的基本配置信息 2.选择数据源 3.mybatis约定 (1)parameterType和resultType 只能传一个参数,但是我们可以传一个数组或者集合,达到传多个参 ...

  5. zookeeper实现项目初始化缓存以及同步监听

    Spring-利用InitializingBean接口和zookeeper实现项目初始化缓存以及同步监听 1.先贴出几个需要用到的工具类 ZkClientUtils import com.ithzk. ...

  6. JVM内存知识备忘

    又是一篇备忘... 主要记录一些知识,进行一些资源的汇总. 先来群里liufor大大提供的两张图,清晰易懂: Dockerized Java https://www.youtube.com/watch ...

  7. 一个.NET Core开发者的Linux入门学习笔记

    用.NET Core开发也有一段时间了,但是由于工作原因一直都是在Windows系统上进行的开发,一直想学习Linux然后把.NET Core开发的程序跑在Linux上,然后把心得体会记录一下发布再博 ...

  8. JVM虚拟机(1)---常用JVM配置参数

    常用JVM配置参数 常用JVM配置参数主要有:Trace跟踪参数.堆的分配参数.栈的分配参数. 一.Trace跟踪参数 跟踪参数用于跟踪监控JVM,对于开发人员来讲用于JVM调优以及故障排查的. 1. ...

  9. 设计模式的征途(C#实现)—文章目录索引

    1.预备篇 UML类图10分钟快速入门 2.创建型模式 ① 设计模式的征途-01.单例(Singleton)模式 ② 设计模式的征途-02.简单工厂(Simple Factory)模式 ③ 设计模式的 ...

  10. 从锅炉工到AI专家(3)

    剖析第一个例子 学习<机器学习>,很多IT高手是直接去翻看TensorFlow文档,但碰壁的很多.究其原因,TensorFlow的文档跨度太大了,它首先假设你已经对"机器学习&q ...