转载请注明出处,部分内容引自李煜东《算法竞赛进阶指南》


前置知识:    C++、C语言入门


Set是什么

Set是C++STL中提供的容器,set是数学上的集合——具有唯一性,即每个元素只出现一次,而multiset则是可重集,两者的内部实现是一棵红黑树,它们支持的函数基本相同

Set的相关操作

头文件

#include<set>

声明:

像这样:

set<类型>名称;

比如:

set<int>s;
set<vector<int> >s; //vector中提供重载<
set<set<int> >s; //平衡树嵌套,哈哈
multiset<double>s;

就像其他需要排序的数据类型一样,为一个结构体的set,需要重载小于号

struct node{
......;
};
set<node>s;
bool operator <(const node &ai,const node &bi)
{
return ai.x>bi.x;
}

set.size()

统计set中元素个数,函数返回一个整形变量,表示set中元素个数,时间复杂度O(1)

用法:名称.size();
eg.
int num=s.size();

set.empty()

检查set是否为空,返回一个bool型变量,1表示set为空,否则为非空,时间复杂度O(1)

用法:名称.empty();
eg.
if(s.empty())
cout<<"Myset is Empty."<<endl;

set.clear()

清空set,无返回值

用法:名称.clear();
eg.
s.clear();

set.count(x)

返回set或multiset中值为x的元素个数,时间复杂度为O(log n)

用法:名称.count(x)
eg.
if(!s.count(x))
ans++;

迭代器

双向访问迭代器,不支持随机访问,支持星号解除引用,仅支持“++”,“--”这两个算术操作
引用和操作:

set<类型>::iterator it;
eg.
set<int>::iterator it=s.begin();
it++;
it--;

若把it++,则it将会指向“下一个”元素。这里的下一个是指在key从小到大排序的结果中,排在it下一名的元素。同理,若把it--,则it会指向排在上一个的元素

“++”,“--”操作的复杂度均为O(log n)

遍历set及访问其中的元素

//set
for(set<int>::iterator it=s.begin();it!=s.end();it++)
cout<<*it<<endl; //取出这个迭代器指向的元素
//set嵌套
for(set<set<int> >::iterator it=s.begin();it!=s.end();it++)
{
//首先取出set中嵌套的set
for(set<int>::iterator rit=(*it).begin();rit!=(*it).end();rit++)
cout<<*rit<<' '; //遍历这个set
cout<<endl;
}

set.begin()

返回集合的首迭代器,即指向集合中最小元素的迭代器,时间复杂度为O(1)

用法:名称.begin();
eg.
map<int>::iterator it=s.begin();

set.end()

返回集合的尾迭代器,众所周知,STL中区间都是左闭右开的,那么end()函数返回的迭代器即为指向集合中最大元素的下一个位置的迭代器,因此--s.end()才是指向集合中最大元素的迭代器,时间复杂度为O(1)

用法:名称.end();
eg.
maxn=*(--s.end()); //取出最大元素

set.insert(x)

在set中插入元素,返回插入地址的迭代器和是否插入成功的bool并成的pair,时间复杂度为O(log n)

PS:set在进行插入的时候是不允许有重复的键值的,如果新插入的键值与原有的键值重复则插入无效(multiset可以重复)

用法:名称.insert(set类型);
eg.
s.insert();

set.erase(参数)

删除,参数可以是元素或者迭代器,返回下一个元素的迭代器,时间复杂度为O(log n),注意在multiset中s.erase(x)会删除所有值为x的元素

用法:名称.erase(参数);
eg.
set<int>::iterator it=s.begin();
s.erase(it);
s.erase();

set.find(x)

在set中查找值为x的元素,并返回指向该元素的迭代器,若不存在,返回set.end(),时间复杂度为O(log n)

用法:名称.find(x);
eg.
if(s.find(x)!=s.end())
cout<<"Have Found!"<<endl;

set.lower_bound(x)/upper_bound(x)

两个神奇的东西,决定把他们放在一块谈一谈

用法与find类似,但查找的条件略有不同,时间复杂度O(log n)

s.lower_bound(x)表示查找>=x的元素中最小的一个,并返回指向该元素的迭代器

s.upper_bound(x)表示查找>x的元素中最小的一个,并返回指向该元素的迭代器

举个例子:

在set{3,5,7,8,13,16}中

对于在set中存在的元素,比如8

s.lower_bound(8)返回8所在位置的迭代器

s.upper_bound(8)返回13所在位置的迭代器

对于在set中不存在的元素,比如12

两个函数返回的则都是13所在位置的迭代器

特殊地,

对于比set中最大的元素大的元素,比如20

两个函数返回的都是s.end()

STL整理之set的更多相关文章

  1. C++STL整理

    STL整理 vector #include<bits/stdc++.h> #define go(i,a,b) for(int i=a;i<b;i++) using namespace ...

  2. STL整理

    sort 升序排列: iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素. iterator up ...

  3. C++ STL 整理

    一.一般介绍 STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库.它被容纳于C++标准程序库(C++ Standard Library ...

  4. 数据结构知识总结(STL整理)

    重要知识点 1.基础知识 #include<bits/stdc++.h> //万能头文件 #include< algorithm > //包含sort函数 运用sort实现多关 ...

  5. STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)(转)

    向量(vector) <vector> 连续存储的元素<vector> Vector<int>c; c.back()    传回最后一个数据,不检查这个数据是否存在 ...

  6. STL整理之map

    转载请注明出处,部分内容引自李煜东<算法竞赛进阶指南> 前置知识:    C++.C语言入门 Map是什么 Map是从键(key)到值(value)的映射,其内部实现是一棵以key为关键码 ...

  7. Problem G: STL——整理唱片(list的使用)

    #include<iostream> #include<list> #include<iterator> #include<algorithm> usi ...

  8. C++常用STL

    目录 C++ 常用STL整理 容器和配接器 list(链表) stack(栈) queue(队列) priority_queue(优先队列) set(集合) vector(向量) map&&a ...

  9. 洛谷日报 & 原来博客(转载)

    震惊,新的功能:可以按Ctrl + F 进行关键字查询. \(update\) on 10.26:把这两个月的日报也加入进去了,并且修复了几个错误. 本文会把小编用过的博客和比较好的博客放在这里. 可 ...

随机推荐

  1. UTF-8 GBK GB2312

    至于UTF-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码.对于英文字符较多的论坛则用UTF-8节省空间. GBK包含全部中文字符:UT ...

  2. 关于Jenkins部署代码权限三种方案

    关于Jenkins部署代码权限三种方案 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.修改Jenkins进程用户为root [root@jenkins ~]# cat /etc ...

  3. cisco常用命令详解

    cisco常用命令详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常用命令用法展示 1.命令行模式的来回切换 yinzhengjie>enable #从用户模式切换到 ...

  4. 网络编程基础【day10】:IO多路复用

    这些名词比较绕口,理解涵义就好.一个epoll场景:一个酒吧服务员(一个线程),前面趴了一群醉汉,突然一个吼一声“倒酒”(事件),你小跑过去给他倒一杯,然后随他去吧,突然又一个要倒酒,你又过去倒上,就 ...

  5. RocketMQ在windows环境下的安装

    原博地址:https://www.jianshu.com/p/4a275e779afa 一.预备环境 1.系统 Windows 2. 环境 JDK1.8.Maven.Git 二. RocketMQ部署 ...

  6. springSession框架来实现sso单点登陆

    介绍一下springsession这个框架,其实springsession框架默认的是使用redis来实现单点登陆的,但是不支持redis集群,这个框架的特点是无侵入的实现单点登陆,就是说我们之前获取 ...

  7. gcc和gdb使用笔记

    gcc: http://wiki.ubuntu.org.cn/Gcchowto gdb: http://wiki.ubuntu.org.cn/%E7%94%A8GDB%E8%B0%83%E8%AF%9 ...

  8. Javaweb学习笔记——(七)——————myexlipse基本使用、jdk5.0新特性及反射讲解

    1.debug调试模式: *使用这种模式,调试程序(看到程序运行停止在这一行) -显示出来行号 -双击左边,出现一个圆点,表示设置了一个断点 *使用debug as方式,运行程序 -特使是否进入到调试 ...

  9. ==========2014-04-24=========winform树控件勾选方法 和获取所有选中的

    http://bbs.bccn.net/thread-197567-1-1.html /// <summary> /// 已选中或取消选中树节点上的复选框时 /// </summar ...

  10. jenkins配置sonarqube

    jenkins配置sonarqube 下载插件SonarQube Scanner for Jenkins 在系统管理系统设置中选择 SonarQube servers 配置服务器名称.访问URL地址, ...