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水的大水题

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. 基于Java的ArrayList和LinkedList的实现与总结

    一.定义MyList接口,包含列表常见方法: import java.util.Iterator; /** * 线性表(列表)的接口定义 */ public interface MyList<T ...

  2. 自学Python的经验之谈,学好Python的捷径

    其实python非常适合初学者入门.相比较其他不少主流编程语言,有更好的可读性,因此上手相对容易.自带的各种模块加上丰富的第三方模块,免去了很多“重复造轮子”的工作,可以更快地写出东西.配置开发环境也 ...

  3. [Swift]LeetCode852. 山脉数组的峰顶索引 | Peak Index in a Mountain Array

    Let's call an array A a mountain if the following properties hold: A.length >= 3 There exists som ...

  4. Spring Boot @ControllerAdvice 处理全局异常,返回固定格式Json

    需求 在构建RestFul的今天,我们一般会限定好返回数据的格式比如: { "code": 0,  "data": {},  "msg": ...

  5. python3+ selenium3开发环境搭建-手把手教你安装python(详细)

    环境搭建 基于python3和selenium3做自动化测试,俗话说:工欲善其事必先利其器:没有金刚钻就不揽那瓷器活,磨刀不误砍柴工,因此你必须会搭建基本的开发环境,掌握python基本的语法和一个I ...

  6. Javascript基本类型回顾

    本文是学习和总结ECMAScript5.1规范形成的.是对规范中所提及的Javascript类型进行剖析后的个人观点的表达(如有Bug望各位道友指正).主要是各类型的实例方法,不包含任务构造函数的方法 ...

  7. [Leetcode]112. Path Sum -David_Lin

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

  8. shell实战之Linux主机系统监控

    1.系统监控概述 采集的监控信息主要有内存占用率,CPU占用率,当前在线用户,磁盘挂载及磁盘空间使用率,平均每秒写入流量,平均每秒流出流量.磁盘IO:平均每秒从磁盘读入内存的速率,平均每秒从内存写入磁 ...

  9. 【Java基础】【01初识Java】

    01.01_计算机基础知识(计算机概述)(了解) A:什么是计算机?计算机在生活中的应用举例 计算机(Computer)全称:电子计算机,俗称电脑.是一种能够按照程序运行,自动.高速处理海量数据的现代 ...

  10. 简单的SQL注入

    Topic Link http://ctf5.shiyanbar.com/423/web/ 1)测试输入1的时候正常显示 2) 单引号测试输入1'发现存在漏洞(判断为字符型注入) 3) 联合注入测试( ...