第一次想认真地学学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. leetcode实战

    leetcode记录 两数之和 题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案. ...

  2. webpack创建页面的过程

    1.项目文件夹中创建各类型文件放置的文件夹,如:iTestingWeb文件夹下创建src dist文件夹,用途:src为源码 dist为生成后的文件放置位置,然后在源码文件夹中进一步按文件类型增加文件 ...

  3. vim编辑器-多行加注释与去注释

    在使用vim编辑器时,有时候需要对多行代码进行加注释或去注释,下面将介绍两种方法. 方法一:块选择模式 1. 插入注释 (1)首先按键盘上的ESC进入命令行模式 (2)再按Ctrl+V进入VISUAL ...

  4. MySQL 8.0.12 基于Windows 安装教程(超级详细)

    MySQL 8.0.12 基于Windows 安装教程(超级详细) (一步一步来,装不了你找我!) 本教程仅适用Windows系统,如果你原本装了没装上,一定要先删除原本的数据库,执行:mysqld ...

  5. #宽带选择# V2EX讨论

    毫无疑问上海联通是最好的,如果你的小区有的话IP 基本上固定,只要你的路由器不掉线不断电我的 IP 已经 hold 了三个多月了.无论是北美 还是日韩新,联通(上海)出口都甩电信普通家宽 N 条街.如 ...

  6. [Maven - Java Version] 如何设置Maven的Java版本或者使用不同的JDK版本编译

    In pom.xml, defined this maven.compiler.source properties to tell Maven to use Java 8 to compile the ...

  7. Git笔记整理

    git 分支:   &.创建分支      创建分支很简单:git branch <分支名>       &.切换分支      git checkout <分支名& ...

  8. grunt,提示node不是内部命令也不是外部命令

    昨天配vue环境,把环境变量改错了.今天grunt报错了,百度一下,就好啦. https://blog.csdn.net/qq_37248318/article/details/80839564 这个 ...

  9. PHP反射学习总结

    反射(Reflection) PHP的反射机制提供了一套反射API,用来访问和使用类.方法.属性.参数和注释等,比如可以通过一个对象知道这个对象所属的类,这个类包含哪些方法,这些方法需要传入什么参数, ...

  10. 强力推荐!那些你不能错过的 GitHub 插件和工具

    以代码托管平台起家的 GitHub 网站,已然成为全球程序员工作和生活中不可或缺的一份子.从优秀的企业,到优秀的程序员,都将自己最优秀的代码作品存放在这片开源净土里,供彼此学习交流.\\LS--201 ...