第一次想认真地学学set,是在我做一题treap的时候产生的念头。(HNOI2004 宠物收养场,洛谷P2286)

嗯,虽然学过一丢丢的treap和splay,但是这编程复杂度貌似有点高……

无奈翻开了题解,发现了一部分神犇是用set来做这题的(甚至只有30+行代码)

那么,我是一个不愿意敲太多代码的蒟蒻,就左转了百度百科,查了一波set的用法。

但是,这些用法大全将的东西好深奥呀QAQ,几乎除了insert操作其它的什么都不会……


所以,特发拙文普及一波set的用法,也让大家不再陷入各种玄学数据结构的坑中。

0. 定义一个set容器

  • step1:using namespace std;
  • step2:直接set<成员类型>成员名

例如:定义一个整型的set容器叫做cc,那么直接set<int> cc就行了。


1. insert操作

作用:往你定义的set里面加上一个数。

  • step1:定义一个辅助变量tmp;
  • step2:输入tmp;
  • step3:将tmp放进你定义的set容器里面。

例如:往刚定义的cc里面放一个tmp,那么直接:cc.insert(tmp)即可。


2. clear操作

作用:清空你的set容器。

  • step1:将你的set容器清空。

例如:将刚才定义的cc清空,则为:cc.clear()即可。


3. empty判断

作用:判断你的容器是否为空。

  • step1:判断你的容器是否为空。

例如:判断cc是否为空,只需 if(cc.empty())  即可,判断是否非空,只需if (!cc.empty())。


4. size询问

作用:询问你的容器里有多少个元素。

例如:询问cc的大小,只需 printf("%d\n",cc.size())即可。

特别的,size返回的是非重复元素,而不是所有元素。

例如:

cc里面有{1 2 3 4 5 6 7 8} 8个元素,那么他的返回值是8;

cc里面有{1 1 1 1 1 1 1 1} 8个元素,那么他的返回值是1;

cc里面有{1 1 1 2 2 6 2 1} 8个元素,那么他的返回值是3。


5. begin,end和对set容器的遍历

这个东西的确有点难……

首先,如果你要对一个set容器进行遍历的话,你要多开两个迭代器,然后以这两个迭代器分别为头和尾遍历。

如果你要对cc进行一次遍历输出,下面是具体操作步骤:

step1:定义两个东西:①set<int>::iterator starti = cc.begin();②set<int>::iterator endi = cc.end();

step2:进行一次遍历:

for (;starti!=endi;starti++)
{
printf("%d\n",*starti);
}

因为begin()和end()返回的都是第一个或者最后一个元素的地址,所以我们在输出的时候就要加个指针*,表示指向该地址存放的元素。

当然,begin()和end()还有其它的用处,具体的就在刷题过程中领悟吧。

重点提示:循环的时候,不能写成starti<=endi,因为这里面没有重载<=的符号,只有!=。


6. max_size询问

询问的是这个set容器的最大存放量。

这东西好像没什么用QAQ……

首先定义一个叫cc的set容器,然后直接询问cc.max_size()就行啦。

附:各种类型的set的存放量:

测试代码如下:

#include <set>
#include <cstdio>
using namespace std;
set<short> cc0;
set<int> cc1;
set<long> cc2;
set<long long> cc3;
set<unsigned long long> cc4;
set<unsigned long> cc5;
set<unsigned short> cc6;
set<unsigned> cc7;
set<bool> cc8;
set<float> cc9;
set<double> cc10;
int main()
{
printf("%d\n",cc0.max_size());
printf("%d\n",cc1.max_size());
printf("%d\n",cc2.max_size());
printf("%d\n",cc3.max_size());
printf("%d\n",cc4.max_size());
printf("%d\n",cc5.max_size());
printf("%d\n",cc6.max_size());
printf("%d\n",cc7.max_size());
printf("%d\n",cc8.max_size());
printf("%d\n",cc9.max_size());
printf("%d\n",cc10.max_size());
  return ;
}

输出结果如下:



7. erase操作

别问我为什么上面有两条分割线……

作用:删除set中的某一个元素。

假如,我首先在cc里面加入了1,2,3,4,5 共5个元素,然后我要删除4,再将cc中剩余的4个数输出,

那么,具体代码如下:

#include <set>
#include <cstdio>
#include <iostream>
using namespace std;
set<int> cc; //构造set
int main()
{
int n;
scanf("%d",&n);
for (int i=;i<=n;i++)
{
int tmp;
scanf("%d",&tmp);
cc.insert(tmp); //往cc里面输入东西
}
int need_delete;
scanf("%d",&need_delete); //输入想要删除的数
cc.erase(need_delete);    
set<int>::iterator starti = cc.begin();
set<int>::iterator endi = cc.end();
for (;starti != endi;starti++)
printf("%d\n",*starti);
}

STL中set的使用方法的更多相关文章

  1. STL中的set使用方法详细!!!!

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

  2. C++的STL中vector内存分配方法的简单探索

    STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux  CentOS 5.2 1.代码 #include <vector> #include <stdio ...

  3. STL中list的erase()方法

    http://www.cnblogs.com/gshlsh17/ rase()方法是删除iterator指定的节点  但是要注意的是在执行完此函数的时候iterator也被销毁了   这样的话关于it ...

  4. STL中队列(queue)的使用方法

    STL 中队列的使用(queue) 基本操作: push(x) 将x压入队列的末端 pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值 front() 返回第一个元素(队顶元素) ...

  5. 手写队列以及stl中队列的使用

    一,手写队列. struct queue { ; ,rear=,a[maxn]; void push(int x) { a[++rear]=x; } void pop() { first++; } i ...

  6. STL中的nth_element()方法的使用

    STL中的nth_element()方法的使用 通过调用nth_element(start, start+n, end) 方法可以使第n大元素处于第n位置(从0开始,其位置是下标为 n的元素),并且比 ...

  7. stl中map的四种插入方法总结

    stl中map的四种插入方法总结方法一:pair例:map<int, string> mp;mp.insert(pair<int,string>(1,"aaaaa&q ...

  8. gcd手写代码及STL中的使用方法

    一.手写代码 inline int gcd(int x,int y){ if(y==0) return x; else return(gcd(y,x%y)); } 二.STL中的使用方法 注:在STL ...

  9. STL中的set容器的一点总结

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

随机推荐

  1. Pandorabox(Openwrt) 双宽带(WAN) 叠加网络实战

    准备 一台已经刷好Pandorabox(Openwrt)的路由器.两条宽带 实战环境 固件:PandoraBox R8.1.12 By Lean 硬件:K2P A1版 过程 配置VLAN 为了将一个L ...

  2. [IoC容器Unity]第一回:Unity预览

    1.引言 高内聚,低耦合成为一个OO架构设计的一个参考标准.高内聚是一个模块或者一个类中成员跟这个模块或者类的关系尽量高,低耦合是不同模块或者不同类之间关系尽量简单. 拿咱国家举例来说,假如你是中国人 ...

  3. pycharm的pip安装问题,需要确认适合IDE的pip版本

    python 报错     AttributeError: module 'importlib._bootstrap' has no attribute 'SourceFileLoader' 解决方法 ...

  4. 浅谈现公司的Spring Cloud微服务框架

    目录 说在前面 服务注册与发现 服务网关及熔断 配置中心 消息中心.服务链路追踪 小言 说在前面 本文偏小白,大佬慎入,若有错误或者质疑,欢迎留言提问,谢谢,祝大家新年快乐. spring cloud ...

  5. android studio出现offline情况

    1.检查是否打开开发者选项 2.检查手机是否处于传输文件模式

  6. Hadoop之运行环境搭建

    一.虚拟机环境准备 1.克隆虚拟机 2.修改克隆虚拟机静态IP 3.修改主机名 4.关闭防火墙 5.创建hadoop用户 6.配置hadoop用户具有root权限 7.在/opt 目录下创建文件夹 1 ...

  7. Redis(二)--Jedis使用

    1.Jedis是连接java和redis的jar,这里用maven来添加jar包 # 在eclipse中新建maven project,填写GroupID.Artifactid # 在百度搜索mave ...

  8. 音频转化mp3 ,到底选vbr还是cbr

    毫无疑问,aac格式是最好的. 其次,应该是 vbr. 参考下面文章 http://tieba.baidu.com/p/1966991568 总结: 1.正版iTunes Plus 256K AAC格 ...

  9. SVN-Failed to run the WC DB work queue associated with

    解决方法:清空svn的队列 1.下载sqlite3.exe 2.找到你项目的.svn文件,查看是否存在wc.db 3.将sqlite3.exe放到.svn的同级目录 4.启动cmd执行sqlite3 ...

  10. Postman中x-www-form-urlencoded请求K-V的ajax实现

    在Postman中使用x-www-form-urlencoded,并且用K-V传值,但是在代码中用ajax来请求,传值一直有问题,静下心来思考才发现K-V传入的是string,所以记录下来以防忘记!! ...