STL中set的使用方法
第一次想认真地学学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的使用方法的更多相关文章
- STL中的set使用方法详细!!!!
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...
- C++的STL中vector内存分配方法的简单探索
STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux CentOS 5.2 1.代码 #include <vector> #include <stdio ...
- STL中list的erase()方法
http://www.cnblogs.com/gshlsh17/ rase()方法是删除iterator指定的节点 但是要注意的是在执行完此函数的时候iterator也被销毁了 这样的话关于it ...
- STL中队列(queue)的使用方法
STL 中队列的使用(queue) 基本操作: push(x) 将x压入队列的末端 pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值 front() 返回第一个元素(队顶元素) ...
- 手写队列以及stl中队列的使用
一,手写队列. struct queue { ; ,rear=,a[maxn]; void push(int x) { a[++rear]=x; } void pop() { first++; } i ...
- STL中的nth_element()方法的使用
STL中的nth_element()方法的使用 通过调用nth_element(start, start+n, end) 方法可以使第n大元素处于第n位置(从0开始,其位置是下标为 n的元素),并且比 ...
- stl中map的四种插入方法总结
stl中map的四种插入方法总结方法一:pair例:map<int, string> mp;mp.insert(pair<int,string>(1,"aaaaa&q ...
- gcd手写代码及STL中的使用方法
一.手写代码 inline int gcd(int x,int y){ if(y==0) return x; else return(gcd(y,x%y)); } 二.STL中的使用方法 注:在STL ...
- STL中的set容器的一点总结
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...
随机推荐
- 关于bootstrap框架美化的实例教程(python)
经过上一章的内容,其实就页面层来说已结可以很轻松的实现功能了,但是很明显美观上还有很大的欠缺,现在有一些很好的前端css框架,如AmazeUI,腾讯的WeUI等等,这里推荐一个和flask集成很好的b ...
- elasticsearch_.net_client_nest2.x_到_5.x常用方法属性差异
目录: Elasticsearch .net client NEST 5.x 使用总结 elasticsearch_.net_client_nest2.x_到_5.x常用方法属性差异 Elastics ...
- nDPI-dev分析
目前在 分为两个层次:其一是应用分析,学会如何使用:其二是原理分析,看懂它如何实现. 1. 打包该数据帧,搜集l3.l4层报头信息 2. 查询链接跟踪(如果已被标识,则直接获取到该数据帧所属协议类型) ...
- 动态 DP 学习笔记
不得不承认,去年提高组 D2T3 对动态 DP 起到了良好的普及效果. 动态 DP 主要用于解决一类问题.这类问题一般原本都是较为简单的树上 DP 问题,但是被套上了丧心病狂的修改点权的操作.举个例子 ...
- 闽南师范大学·大英A3复习专题
精读<新视野·读写教程A3> U2: words: TEXT A TEXT B appraise vt.评定 | abort vt.(因困难或危险)使(活动)终止 paralyze v ...
- Kotlin 扩展
Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式. 扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响. 扩展函数 扩展函数可以在已有类中添加新的方法 ...
- Shiro 与spring 整合的及简单使用(转)
文章完全转载自: http://www.cnblogs.com/learnhow/p/5694876.html ,大家可以点击访问原文链接,个人仅作学习收藏 ! 本篇内容大多总结自张开涛的<跟 ...
- java异常处理try catch finally
1 异常 1.1 异常处理的作用 在编程时,如果出现文件打开失败,读写文件就会异常退出.如果出现内存溢出错误,程序也会异常退出.如果不能对这些异常进行处理.程序则无法正常运行.所 ...
- 如何让写得html页面自动刷新
一:新建一个文件夹用vscode打开 二:终端输入npm init 然后一路回车会在文件夹中生成一个package.json文件 三:新建个html,在终端中输入cnpm install -g liv ...
- LeetCode--032--最长有效括号(java)
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()&quo ...