详解C++ STL set 容器

本篇随笔简单介绍一下\(C++STL\)中\(set\)容器的使用方法及常见使用技巧。

set容器的概念和性质

\(set\)在英文中的意义是:集合。\(set\)容器也的确“人如其名”,实现了这个集合的功用。

高中数学必修一集合那章(高一以下的小伙伴不用慌,不讲数学只讲概念),关于集合的性质,给出了三个概念:无序性、互异性、确定性

那么,\(set\)容器的功用就是维护一个集合,其中的元素满足互异性。

我们可以将其理解为一个数组。这个数组的元素是两两不同的。

这个两两不同是指,如果这个\(set\)容器中已经包含了一个元素\(i\),那么无论我们后续再往里假如多少个\(i\),这个\(set\)中还是只有一个元素\(i\),而不会出现一堆\(i\)的情况。这就为我们提供了很多方便。

但是,需要额外说明的是,刚刚说集合是有无序性的,但是\(set\)中的元素是默认排好序(按升序排列)的。(稍微说一句,\(set\)容器自动有序和快速添加、删除的性质是由其内部实现:红黑树(平衡树的一种)。这个东西过于高深我不会,所以不予过多介绍,有兴趣的小伙伴可以自行浏览相关内容。)

set容器的声明

\(set\)容器的声明和大部分\(C++STL\)容器一样,都是:容器名<变量类型> 名称的结构。前提需要开#include库。如:

#include<set>
set<int> s;
set<char> s;
set<pair<int,int> > s;
set<node> s;
struct node{...};

set容器的使用

其实,\(C++STL\)容器的使用方式都是差不多的。我们完全可以举一反三地去类比。与\(bitset\)重定义了许多奇形怪状新的函数之外,其他都是大致相同的。所以笔者在此不再做幼稚的介绍,大家都是竞赛狗,应该都能自己看明白。

s.empty();

\(empty()\)函数返回当前集合是否为空,是返回1,否则返回0.

s.size();

\(size()\)函数返回当前集合的元素个数。

s.clear();

\(clear()\)函数清空当前集合。

s.begin(),s.end();

\(begin()\)函数和\(end()\)函数返回集合的首尾迭代器。注意是迭代器。我们可以把迭代器理解为数组的下标。但其实迭代器是一种指针。这里需要注意的是,由于计算机区间“前闭后开”的结构,\(begin()\)函数返回的指针指向的的确是集合的第一个元素。但\(end()\)返回的指针却指向了集合最后一个元素后面一个元素。

s.insert(k);

\(insert(k)\)函数表示向集合中加入元素\(k\)。

s.erase(k);

\(erase(k)\)函数表示删除集合中元素\(k\)。这也反映了\(set\)容器的强大之处,指哪打哪,说删谁就删谁,完全省略了遍历、查找、复制、还原等繁琐操作。更不用像链表那种数据结构那么毒瘤。直接一个函数,用\(O(logn)\)的复杂度解决问题。

s.find(k);

\(find(k)\)函数返回集合中指向元素\(k\)的迭代器。如果不存在这个元素,就返回\(s.end()\),这个性质可以用来判断集合中有没有这个元素。

其他好用的函数

下面介绍一些不是很常用,但是很好用的\(set\)容器的内置函数

s.lower_bound(),s.upper_bound();

熟悉\(algorithm\)库和二分、离散化的小伙伴会对这两个函数比较熟悉。其实这两个函数比较常用。但是对于\(set\)集合来讲就不是很常用。其中\(lower\_bound\)返回集合中第一个大于等于关键字的元素。\(upper\_bound\)返回集合中第一个严格大于关键字的元素。

s.equal_range();

这个东西是真的不常用...可能是我太菜了。

这个东西返回一个\(pair\)(内置二元组),分别表示第一个大于等于关键字的元素,第一个严格大于关键字的元素,也就是把前面的两个函数和在一起。如果有一个元素找不到的话,就会返回\(s.end()\)。

详解C++ STL set 容器的更多相关文章

  1. 详解C++ STL map 容器

    详解C++ STL map 容器 本篇随笔简单讲解一下\(C++STL\)中的\(map\)容器的使用方法和使用技巧. map容器的概念 \(map\)的英语释义是"地图",但\( ...

  2. 详解C++ STL priority_queue 容器

    详解C++ STL priority_queue 容器 本篇随笔简单介绍一下\(C++STL\)中\(priority_queue\)容器的使用方法和常见的使用技巧. priority_queue容器 ...

  3. 详解C++ STL multiset 容器

    详解C++ STL multiset 容器 本篇随笔简单介绍一下\(C++STL\)中\(multiset\)容器的使用方法及常见使用技巧. multiset容器的概念和性质 \(set\)在英文中的 ...

  4. 【docker-compose】docker-compose.yml文本内容详解 + docker-compose命令详解 + docker-compose启动服务容器时区设置

    参考地址:https://blog.csdn.net/Kiloveyousmile/article/details/79830810 参考地址:https://docs.docker.com/comp ...

  5. JavaWeb开发之详解Servlet及Servlet容器

    自JavaEE诞生伊始,Servlet容器和Servlet技术,就构成了JavaEE应用的核心,配合其它组件,它们完善了Java企业级开发的全套解决方案.小到一个静态博客网站,大到分布式的集群应用,都 ...

  6. 详解华为云基因容器服务GCS

    基因测序,作为“下一个能够改变世界”的技术,已经由实验室研究演变到临床使用,为人类预测罹患多种疾病的可能性,提前预防和治疗疾病提供了一套可靠的方法和手段.而基于基因测序在预防和治疗疾病方面的准确和可靠 ...

  7. 跟我一起学STL(2)——vector容器详解

    一.引言 在上一个专题中,我们介绍了STL中的六大组件,其中容器组件是大多数人经常使用的,因为STL容器是把运用最广的数据结构实现出来,所以我们写应用程序时运用的比较多.然而容器又可以序列式容器和关联 ...

  8. stl——vector详解

    stl——vector详解 stl——vector是应用最广泛的一种容器,类似于array,都将数据存储于连续空间中,支持随机访问.相对于array,vector对空间应用十分方便.高效,迭代器使ve ...

  9. Tomcat使用详解

    Tomcat简介 官网:http://tomcat.apache.org/ Tomcat GitHub 地址:https://github.com/apache/tomcat Tomcat是Apach ...

随机推荐

  1. sqliteman

    2.安装文件 采用源码方式安装 可用下面地址自行下载 https://sourceforge.net/projects/sqliteman/files/sqliteman/1.2.2/ 3.安装 1) ...

  2. WPf 带滚动条WrapPanel 自动换行 和控件右键菜单

    原文:WPf 带滚动条WrapPanel 自动换行 和控件右键菜单 技能点包括 WPf 样式的引用 数据的验证和绑定 比较适合初学者 前台: <Window.Resources> < ...

  3. 一些你不知道的css特性【一】

    浏览器禁止用户在标签的style中使用js写入"!important"的特性 我们在使用jQuery设置css的时候 $('#text').css('height', '200px ...

  4. PHP 多进程和多线程的优缺点

    PHP 多进程和多线程的优缺点 多进程 1.使用多进程, 子进程结束以后, 内核会负责回收资源 2.使用多进程, 子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程. 3.一个常 ...

  5. ElementTree类

    elementtree主要是一个包含根节点的树的文档包装器 它提供了序列化和一般文档处理的两种方法 from lxml import etree str = '''<?xml version=& ...

  6. MySQL for OPS 09:MHA + Atlas 实现读写分离高可用

    写在前面的话 前面做了 MHA 高可用,但是存在这样一个问题,我们花了 4 台机器,但是最终被利用起来的也就一台,主库.这样硬件利用率才 25%,这意味着除非发生故障,不然其他几台机器都是摆设.明显的 ...

  7. java高并发系列 - 第10天:线程安全和synchronized关键字

    这是并发系列第10篇文章. 什么是线程安全? 当多个线程去访问同一个类(对象或方法)的时候,该类都能表现出正常的行为(与自己预想的结果一致),那我们就可以所这个类是线程安全的. 看一段代码: pack ...

  8. Java电商项目-1.构建数据库,搭建项目环境

    目录 到Github获取源码请点击此处 一. 数据库还原 二. Mybatis逆向生成工具的使用 三. 搭建项目环境 四. 在linux虚拟机上部署zookeeper, 搭建Dubbo服务. linu ...

  9. String与StringBuilder性能比对

    //String与StringBuilder性能比对package seday01;/** * String修改字符串带来的性能开销 * @author xingsir * */public clas ...

  10. 数据库-用户管理与pymysql

    mysql用户管理 !这是dba的活儿!,但是万一公司没有dba? mysql用户指的是什么? 我们每一次在操作前都需要指定账号和密码,这个账号就是mysql的用户; 为什么要管理? 一个公司不可能只 ...