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用来描述这种集合迭代运算的方 ...
随机推荐
- vue+mescroll=VScrollFull
VScrollFull 介绍 这个组件是什么? 是为了方便的使用下拉刷新,上拉加载而去封装的一个依赖于 mescroll.js 的 vue 组件(未发布,文末代码~) 封装这个组件使用了什么? mes ...
- 【RL-TCPnet网络教程】第24章 RL-TCPnet之网络控制报文协议ICMP
第24章 RL-TCPnet之网络控制报文协议ICMP 本章节为大家讲解ICMP(Internet Control Message Protocol,网络控制报文协议),通过前面章节对TCP和 ...
- SpringBoot 集成 Swageer2
添加Maven依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox ...
- firefox中遇到的offsetX的问题
项目中遇到一个问题,滚轮缩放或鼠标移动svg的时候,当鼠标放置在svg元素上时,firefox浏览器中的offsetX和offsetY是不准确的,导致缩放和移动会产生便宜,其实问题不是firefox计 ...
- [Swift]LeetCode331. 验证二叉树的前序序列化 | Verify Preorder Serialization of a Binary Tree
One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, ...
- [Swift]LeetCode539. 最小时间差 | Minimum Time Difference
Given a list of 24-hour clock time points in "Hour:Minutes" format, find the minimum minut ...
- 如何随机排序数组?使用多种方式!递归,迭代,洗牌,sort方法!
方式1: 使用sort 方法 ---- // 方法1 使用sort 方法 var arr = [1,2,3,4,5,6,7,8]; function foo(arr) { var cloneArr = ...
- 优化之Source Qualifier组件
勾选Select Distinct选项,该选项可去除重复记录,以此达到减少数据量从而提高性能 ----------------------------------------------------- ...
- python网络-多线程(22)
一.什么是线程 线程(英语:thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.同一进程中的多条线程将共享该进程中的全部系统资源,一个进程可以有很多线程,每 ...
- linux配置jdk环境变量
首先在Linux解压后缀为.tar.gz的jdk压缩文件 解压到当前的文件夹 tar -zcvf /root/java/jdk版本编号 指令: cd 目录路径 -> 是进入该目录路径 c ...