set用法小结
set本质上是一棵红黑树,用法也就那么几个,插入删除lowerbound,再就是迭代器之类的
基本用法
begin()--返回指向第一个元素的迭代器
- #include<cstdio>
- #include<set>
- int main()
- {
- std::set<int>s;
- s.insert();
- s.insert();
- s.insert();
- printf("%d",*s.begin());
- //输出4
- return ;
- }
begin()
end()--返回指向最后一个元素的迭代器
- #include<cstdio>
- #include<set>
- int main()
- {
- std::set<int>s;
- s.insert();
- s.insert();
- s.insert();
- printf("%d",*s.end());
- //注意这里的跌倒器指向的是一个空位置!
- //所以最好不要输出end()
- //输出末尾元素可以用下面的方法
- //std::set<int>::iterator it=s.end();
- //printf("%d",*--it);
- return ;
- }
end()
rbegin()--返回指向集合中最后一个元素的反向迭代器
rend()--返回指向集合中第一个元素的反向迭代器
find()--返回一个指向被查找到元素的迭代器
insert()--在集合中插入元素
size()--集合中元素的数目
clear()--清除所有元素
- #include<cstdio>
- #include<set>
- int main()
- {
- std::set<int>s;
- s.insert();
- s.insert();
- s.insert();
- printf("%d\n",s.size());
- s.clear();
- printf("%d\n",s.size());
- return ;
- }
clear()
count()--返回某个值元素的个数//主要应用于multiset
- #include<cstdio>
- #include<set>
- int main()
- {
- std::multiset<int>s;
- s.insert();
- s.insert();
- s.insert();
- printf("%d",s.count());
- return ;
- }
count
empty()--如果集合为空,返回true
erase()--删除集合中的元素
erase可以删除给定的元素,也可以删除迭代器
在multiset中,删除给定的元素是全部删除,而删除迭代器只会删除一次,下面还会讲到
- #include<cstdio>
- #include<set>
- int main()
- {
- std::set<int>s;
- s.insert();
- s.insert();
- s.insert();
- s.erase();
- s.erase(s.find());
- if(s.find()==s.end()) printf("5 is not found\n");
- if(s.find()==s.end()) printf("4 is not found\n");
- if(s.find()!=s.end()) printf("6 is found");
- return ;
- }
erase()
lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
- #include<cstdio>
- #include<set>
- int main()
- {
- std::set<int>s;
- s.insert();
- s.insert();
- s.insert();
- printf("%d",*s.lower_bound());
- //输出为4
- return ;
- }
lower_bound()
upper_bound()--返回大于某个值元素的迭代器
- #include<cstdio>
- #include<set>
- int main()
- {
- std::set<int>s;
- s.insert();
- s.insert();
- s.insert();
- printf("%d",*s.upper_bound());
- //输出为4
- return ;
- }
upper_bound()
swap()--交换两个集合变量
- #include<cstdio>
- #include<set>
- int main()
- {
- std::set<int>s;
- std::set<int>a;
- s.insert();
- s.insert();
- a.insert();
- s.swap(a);
- printf("%d",s.size());
- //输出为1
- return ;
- }
swap()
几个常用操作
正序遍历所有元素
这个需要借助迭代器来实现
set中是重载了迭代器的++和--运算符的,所以直接使用就可以了
- #include<cstdio>
- #include<set>
- #define sit set<int>::iterator
- using namespace std;
- int main()
- {
- set<int>s;
- for(int i=;i<=;i++)
- s.insert(i);
- for(sit i=s.begin();i!=s.end();i++)
- printf("%d ",*i);
- //输出1 2 3 4 5 6 7 8 9 10
- return ;
- }
倒序遍历所有元素
可以使用rbegin和rend实现,他们与begin和end的关系如下图所示
- #include<cstdio>
- #include<set>
- #define rsit set<int>::reverse_iterator
- using namespace std;
- int main()
- {
- set<int>s;
- for(int i=;i<=;i++)
- s.insert(i);
- rsit it=s.rbegin();
- for(rsit i=s.rbegin();i!=s.rend();i++)
- printf("%d ",*i);
- //输出10 9 8 7 6 5 4 3 2 1
- return ;
- }
multiset中删除元素
在multiset中,如果仅仅用erase($x$)来删除$x$元素,那么$x$的出现次数会变为$0$
解决方法是先找到$x$对应的迭代器,然后将迭代器删除,这样就可以使$x$只删除一次
- #include<cstdio>
- #include<set>
- #define sit set<int>::iterator
- using namespace std;
- int main()
- {
- multiset<int>s;
- s.insert();
- s.insert();
- s.insert();
- s.erase();
- printf("%d\n",s.count());
- s.insert();
- s.insert();
- s.insert();
- s.erase(s.find());
- printf("%d\n",s.count());
- //输出0 2
- return ;
- }
自定义排序规则
如果元素不在结构体中,需要自定义结构体并重载“$()$”运算符
- #include<cstdio>
- #include<set>
- #define sit set<int>::iterator
- using namespace std;
- struct comp
- {
- bool operator ()(const int &a,const int &b)
- {
- return a>b;
- }
- };
- int main()
- {
- set<int,comp>s;
- for(int i=;i<=;i++)
- s.insert(i);
- for(sit i=s.begin();i!=s.end();i++)
- printf("%d ",*i);
- //输出10 9 8 7 6 5 4 3 2 1
- return ;
- }
若元素在结构体中,则需要重载$<$运算符
- #include<cstdio>
- #include<set>
- #define sit set<node>::iterator
- using namespace std;
- struct node
- {
- int l,r;
- node(int l=,int r=):l(l),r(r){};
- bool operator < (const node &a) const
- {
- return r==a.r?l<a.l:r<a.r;
- }
- };
- int main()
- {
- set<node>s;
- for(int i=;i<=;i++)
- s.insert(node(i,-i+));
- for(sit i=s.begin();i!=s.end();i++)
- printf("%d %d\n",i->l,i->r);
- //输出
- /*
- 10 1
- 9 2
- 8 3
- 7 4
- 6 5
- 5 6
- 4 7
- 3 8
- 2 9
- 1 10
- */
- return ;
- }
在结构体中二分
只要重载了$<$,就可以在结构体中二分了
- #include<cstdio>
- #include<set>
- #define sit set<node>::iterator
- using namespace std;
- struct node
- {
- int l,r;
- node(int l=,int r=):l(l),r(r){};
- bool operator < (const node &a) const
- {
- return r==a.r?l<a.l:r<a.r;
- }
- };
- int main()
- {
- set<node>s;
- for(int i=;i<=;i++)
- s.insert(node(i,i));
- sit it=s.lower_bound(node(,));
- printf("%d %d",it->l,it->r);
- //输出 2 2
- return ;
- }
题目
都是可以用set水的大水题
set用法小结的更多相关文章
- 转载:Hadoop排序工具用法小结
本文转载自Silhouette的文章,原文地址:http://www.dreamingfish123.info/?p=1102 Hadoop排序工具用法小结 发表于 2014 年 8 月 25 日 由 ...
- [No000010]Ruby 中一些百分号(%)的用法小结
#Ruby 中一些百分号(%)的用法小结 #这篇文章主要介绍了Ruby 中一些百分号(%)的用法小结,需要的朋友可以参考下 what_frank_said = "Hello!"#% ...
- C++ typedef用法小结 (※不能不看※)
C++ typedef用法小结 (※不能不看※) 第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // 这多数不 ...
- 函数fgets和fputs、fread和fwrite、fscanf和fprintf用法小结 (转)
函数fgets和fputs.fread和fwrite.fscanf和fprintf用法小结 字符串读写函数fgets和fputs 一.读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符 ...
- 1:CSS中一些@规则的用法小结 2: @media用法详解
第一篇文章:@用法小结 第二篇文章:@media用法 第一篇文章:@用法小结 这篇文章主要介绍了CSS中一些@规则的用法小结,是CSS入门学习中的基础知识,需要的朋友可以参考下 at-rule ...
- 英语语法最终珍藏版笔记- 21it 用法小结
it 用法小结 it 在英语中的意思较多,用法较广,现总结如下. 一.it作句子的真正主语 1.it 指前面已经提到过的人或事物,有时指心目中的或成为问题的人或事物,作真正主语. 例如: What’s ...
- [转]ssh常用用法小结
ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...
- 结构体定义 typedef struct 用法详解和用法小结
typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便.具体区别在于:若struct node {}这样来定义结构体的话.在申请node 的变量时,需要这样写,stru ...
- typedef用法小结
typedef用法小结- - 注意:本文转自网络,版权归原作者所有. typedef typedef用法小结- - 这两天在看程序的时候,发现很多地方都用到typedef,在结构体定义,还有一些数组等 ...
- NSEnumerator用法小结
NSEnumerator 3)枚举 (NSEnumerator)遍历数组每个索引处的对象,你可以编写一个0到[array count]的循环,而NSEnumerator用来描述这种集合迭代运算的方 ...
随机推荐
- Python-字典与json的转换
#json是字符串,只不过长得像字典 import json user_info='''{"niuhy":1234,"shanbl":44566}''' #js ...
- http请求抓包神器-Fiddler(记录和检查你电脑的所有http通讯)
Fiddler是做什么的,能帮助我们做什么? 1.能够监听http/httpS的流量,可以截获从浏览器或者客户端软件向服务器发送的http/https请求: 2.对截获之后的请求,我们还能够查看请求中 ...
- [Swift]LeetCode128. 最长连续序列 | Longest Consecutive Sequence
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. Y ...
- MyBatis增、删、改、查
1.config.xml文件的基本配置信息 2.选择数据源 3.mybatis约定 (1)parameterType和resultType 只能传一个参数,但是我们可以传一个数组或者集合,达到传多个参 ...
- zookeeper实现项目初始化缓存以及同步监听
Spring-利用InitializingBean接口和zookeeper实现项目初始化缓存以及同步监听 1.先贴出几个需要用到的工具类 ZkClientUtils import com.ithzk. ...
- JVM内存知识备忘
又是一篇备忘... 主要记录一些知识,进行一些资源的汇总. 先来群里liufor大大提供的两张图,清晰易懂: Dockerized Java https://www.youtube.com/watch ...
- 一个.NET Core开发者的Linux入门学习笔记
用.NET Core开发也有一段时间了,但是由于工作原因一直都是在Windows系统上进行的开发,一直想学习Linux然后把.NET Core开发的程序跑在Linux上,然后把心得体会记录一下发布再博 ...
- JVM虚拟机(1)---常用JVM配置参数
常用JVM配置参数 常用JVM配置参数主要有:Trace跟踪参数.堆的分配参数.栈的分配参数. 一.Trace跟踪参数 跟踪参数用于跟踪监控JVM,对于开发人员来讲用于JVM调优以及故障排查的. 1. ...
- 设计模式的征途(C#实现)—文章目录索引
1.预备篇 UML类图10分钟快速入门 2.创建型模式 ① 设计模式的征途-01.单例(Singleton)模式 ② 设计模式的征途-02.简单工厂(Simple Factory)模式 ③ 设计模式的 ...
- 从锅炉工到AI专家(3)
剖析第一个例子 学习<机器学习>,很多IT高手是直接去翻看TensorFlow文档,但碰壁的很多.究其原因,TensorFlow的文档跨度太大了,它首先假设你已经对"机器学习&q ...