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. FCC(ES6写法) Exact Change

    设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) 作为第三个参数. cid  ...

  2. vs2017开发Node.js控制台程序

    1,新建项目  NodejsConsoleApp1 2,在项目的根目录下,添加 sayModule.js 文件 //sayModule.js function Say1Module() { this. ...

  3. Javascript高级编程学习笔记(57)—— 事件(1)事件流

    事件 JS与HTML的交互是通过事件实现的 而事件指的就是:文档或浏览器窗口特定的交互瞬间 可以通过侦听器来预定事件,以便在事件发生时执行相应的代码 这种模式也是设计模式中的观察者模式 事件流 有了事 ...

  4. HttpSession的API

    //获取Session对象request.getSession()request.getSession(boolean create)//获取SessionIdgetId()//获取当前session ...

  5. [Swift]LeetCode30. 与所有单词相关联的字串 | Substring with Concatenation of All Words

    You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...

  6. [Swift]LeetCode123. 买卖股票的最佳时机 III | Best Time to Buy and Sell Stock III

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  7. [Swift]LeetCode435. 无重叠区间 | Non-overlapping Intervals

    Given a collection of intervals, find the minimum number of intervals you need to remove to make the ...

  8. [Swift]LeetCode598. 范围求和 II | Range Addition II

    Given an m * n matrix M initialized with all 0's and several update operations. Operations are repre ...

  9. [Swift]LeetCode899. 有序队列 | Orderly Queue

    A string S of lowercase letters is given.  Then, we may make any number of moves. In each move, we c ...

  10. PowerShell 中 RunspacePool 执行异步多线程任务

    在 PowerShell 中要执行任务脚本,现在通常使用 Runspace,效率很高:任务比较多时,用 Runspace pool 来执行异步操作,可以控制资源池数量,就像 C# 中的线程池一样 == ...