iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ set到底是什么
  • 740
分享到

C++ set到底是什么

2024-04-02 19:04:59 740人浏览 独家记忆
摘要

目录1、set是什么2、set有什么用1、set是什么 如果大家学过几门编程语言,会发现各大语言的特性虽然迥异,但是总有几个东西反复出现刷存在感。它们在各个语言当中的名字虽然不太一样

1、set是什么

如果大家学过几门编程语言,会发现各大语言的特性虽然迥异,但是总有几个东西反复出现刷存在感。它们在各个语言当中的名字虽然不太一样,底层实现也不同,但是做的事情差不多。

c++当中,这几个东西的名字叫做vectorsetmap,它们有一个共同的名字叫做STL(标准模板库)容器

估计不少同学看到容器这两个字脑袋有点发蒙,会有一种我当然知道容器是什么意思,但是我不知道你这里说容器是什么意思的感觉。现实中的容器是用来存储东西的器皿,在编程语言当中,也是一样,只不过存储的不再是实际的物品而是抽象的变量。

那么问题来了,同样是容器,vectorsetmap这些又有什么区别呢?前面的文章里说过,vector类似于数组,可以以线性的形式存储元素。而setmapvector不同,它们不是线性的容器,而是关联式的容器。

看到新的术语,估计又有同学要发蒙了,先别着急发蒙。其实我们可以大胆猜测一下,从字面理解,所谓关联式说白了也就是把两个事物关联起来。那么新的问题又来了,这个关联是什么?我们怎么做的关联,又为什么要做关联?

这几个问题估计连很多老鸟都能唬住。

要解释清楚这个,就需要先来说说set的功能。我们从现象入手去逐渐理解本质。

我们有了vector,可以顺序地存储数据,还可以随心所欲地插入数据非常的方便,那么除了这些之外我们还需要什么呢?

当拥有的数据多了之后,就会产生一个很自然的需求,就是查找数据。数据搜集存储起来之后总是要拿来用的,既然要拿出来用,自然就需要查找。在查找这个需求面前,vector很不够看,因为它当中的数据都是线性排列的,排成一排,需要一个一个查找。数据少还行,如果数据多了,显然忙不过来。

那怎样查找才快呢?

得让数据有顺序,有了顺序查找就快了。比如同样是一行数,如果它们都是有序的,我们就可以通过二分法来查找了,那么复杂度就陡然地从提升到了。看起来好像只是数学公式上的一点微小变化,实际上这两者之间的差距大的离谱,尤其是在海量数据的情况下。

18,446,744,073,709,551,615这个数据够大吗?表示成科学记数法是,比地球上的沙子都多。这么庞大的数据要是一个一个遍历过来真得天荒地老,即使计算机运行速度超快也不行。如果用二分法呢,只需要查找64次。64和一个比地球上沙子数量都大的数相比,这中间的差距可想而知。

所以我们想要快速查找,就必须要让数据有顺序,有了顺序就可以用二分法快速查找。如果我们要存的数是数字,当然很好办,天然有序。如果不是数字其实也很简单,我们可以给它赋上一个id,给它们一个编号,用这个编号来排序,或者是根据我们的需要自己实现排序的逻辑,这都不是问题。

真正的问题在于数据结构,虽然二分法很快,但我们并不能直接使用它。因为我们不能以线性的形式来存储数据,如果我们这样做,当我们要插入元素的时候,就会涉及数组中元素的移动。这一移动,那么插入的复杂度又蜕化成了。

所以我们需要使用二分查找的方法,但又不能使用数组,这就需要我们使用一个新的数据结构。估计学过算法或者是看过老梁之前文章的同学应该已经猜到了,这样的数据结构就是树,准确得说是二叉搜索树。

老梁从网上找来一张图,二叉搜索树长这样:

它看起来很普通,但有一个很牛的性质,就是对于任意一个节点,它都满足它左子树的所有元素都比它小,右子树的所有元素都比它大。当我们想要查找某一个元素的时候就很强大了,我们只需要利用这个性质从根节点开始往左往右遍历,就能找到目标了。

在理想情况下,我们每次进行分支选择的时候,都等价于舍弃掉了一半的元素,也就是将搜索空间缩小了一半。所以它其实也是一个二分查找算法,复杂度同样是。

有了这样的树结构,插入元素的问题就解决了,因为树上的元素都是离散的,我们插入节点并不会影响其他节点。但这又会产生另外一个问题,就是插入元素会破坏树上元素的分布。比如我们一直插入一个比树上所有元素都要小的数,那么这个数会一直被添加在搜索树的最左侧,长此以往就会导致这棵树的左侧元素特别多,这样就会影响元素查找的性能。

好在这个问题并不是无解的,我们可以设计一些算法让树在元素添加或者删除的时候能够自我修复平衡性,一直保持树上元素的平衡。

从这个出发点设计出来的算法有很多,所以自平衡二叉搜索树有很多种。比如常见的AVL、红黑树、SBT等等。在这许多算法当中,公认红黑树的统计性能最好,所以往往setmap这些关联式容器的底层都是用红黑树写的。

所以到这里,整个逻辑就闭合上了,我们也终于可以回答那个一开始的问题。set是个啥?

set是一个用红黑树实现的关联式容器,它可以有序地存储数据,提供快速的查找、添加删除的功能。

2、set有什么用

搞明白了set是个啥,接下来的问题就是它有什么用。

其实某种程度上来说这两个问题是一个问题,理解了它的设计原理和设计思路,自然也就明白了它能干什么。

最大的功能就是数据的查找,由于set底层是通过红黑树实现的,红黑树的本质是二叉搜索树。既然是二叉搜索树就需要保证key唯一,所以set中的元素也必须是唯一的。那么我们就可以利用这个性质来构建一个容器,保证容器内的元素是唯一的,并提供查询功能。

举个简单的例子,比如说开发了一个新功能要上线测试。为了防止除测试人员之外的其他用户遇到bug影响用户体验,所以一般常规措施都是维护一个白名单。也就是在名单中的人才能看到这个特性,其他用户还是走老的逻辑。这样的一个白名单用set就非常合适。

set的常规使用代码也非常简单,也就只有几行:


#include <set>

// 创建set
std::set<T> st;

// 插入元素
T t = T();
st.insert(t);

// 查找元素
if (st.count(t)) {
    
}

当然这个只是最常规最常规的用法,除了这些之外,set还有很多进阶用法,以及不少注意事项。由于篇幅原因,我们下一篇文章再和大家详细聊聊。

到此这篇关于C++ set到底是什么的文章就介绍到这了,更多相关C++ set内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

注:文章转自微信公众号:Coder梁(ID:Coder_LT)

--结束END--

本文标题: C++ set到底是什么

本文链接: https://www.lsjlt.com/news/156204.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ set到底是什么
    目录1、set是什么2、set有什么用1、set是什么 如果大家学过几门编程语言,会发现各大语言的特性虽然迥异,但是总有几个东西反复出现刷存在感。它们在各个语言当中的名字虽然不太一样...
    99+
    2024-04-02
  • C++类和对象到底是什么
    目录1、C++ 中的类2、面向对象编程(Object Oriented Programming,OOP)1、C++ 中的类 C++ 中的类(Class)可以看做C语言中结构体(Str...
    99+
    2024-04-02
  • redis到底是什么
    redis是一个基于内存的高性能键值存储系统,具有以下特性:高性能、支持丰富数据结构、分布式、持久化、复制和多种语言支持。应用场景包括缓存、消息队列、会话管理、排行榜和限制速率。 Re...
    99+
    2024-04-02
  • javascript到底是什么
    这篇文章主要介绍“javascript到底是什么”,在日常操作中,相信很多人在javascript到底是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”javascript...
    99+
    2024-04-02
  • 到底什么是SSL
    本篇内容介绍了“到底什么是SSL”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  什么是SSL?  SSL是一种使用TCP / IP在两个通...
    99+
    2023-06-04
  • ViewState到底是什么
    ViewState是ASP.NET Web Forms中的一个重要概念,用于在Web服务器上存储和恢复页面的状态数据。在Web应用程...
    99+
    2023-09-01
    ViewState
  • MapStruct到底是什么?
    一、简介 现在的分布式系统中模块划分越来越细,不同模块的实体、DTO、DO等需要进行转换,这么多工程处理起来不是那么简单。 MapStruct 就是这样的一个属性映射插件,用于为Ja...
    99+
    2024-04-02
  • Live-USB到底是什么
    本篇文章给大家分享的是有关Live-USB到底是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。我们平时所说的“U 盘”,正式名称是“USB闪存驱动器”(USB Flash ...
    99+
    2023-06-16
  • HTML5到底是什么东西
    HTML,全称为“Hypertext Markup Language”,即超文本标记语言,是Web页面的构建语言。而HTML5,就是HTML的第五代规范,是目前最新的HTML规范。HTML5被认为是Web技术发展的重要里程碑,它的出现为We...
    99+
    2023-05-14
  • 详解JNI到底是什么
    目录一、前言二、准备java代码三、生成头文件四、gcc环境安装五、生成动态链接库六、总结一、前言 首先回顾一下jni的主要功能,从jdk1.1开始jni标准就成为了java平台的一...
    99+
    2024-04-02
  • JS闭包到底是什么
    这篇文章主要讲解了“JS闭包到底是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS闭包到底是什么”吧!  在JavaScript这...
    99+
    2024-04-02
  • c语言到底可以干什么
    c 语言被广泛用于开发多种类型的软件,包括操作系统、嵌入式系统、网络编程、图形编程、人工智能和科学计算。其受欢迎的原因包括效率高、可移植性强、广泛使用和低级控制权限。 C 语言的应用 ...
    99+
    2024-04-13
    linux c语言 macos 网络编程
  • Python的优势到底是什么
    本篇内容介绍了“Python的优势到底是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Python的优点简单:Python是一种代表简单...
    99+
    2023-06-02
  • 到底什么是DNS服务器
    本篇内容介绍了“到底什么是DNS服务器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!概括的说DNS 是计算机域名 系统(Domain Nam...
    99+
    2023-06-07
  • java虚拟机到底是什么
    Java虚拟机(Java Virtual Machine,简称JVM)是一种能够运行Java字节码的虚拟计算机。它是Java编程语言...
    99+
    2023-08-25
    java
  • Python Numpy Load API到底是什么?
    Python是一种广泛使用的编程语言,它有着强大的科学计算能力和丰富的第三方库,其中Numpy库是Python中最为重要的科学计算库之一。Numpy库提供了高效的数组操作和数学函数,使得数据处理和科学计算变得更加简单。其中,Numpy L...
    99+
    2023-09-04
    numpy load api
  • Python中的类到底是什么
    这篇文章主要介绍“Python中的类到底是什么”,在日常操作中,相信很多人在Python中的类到底是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中的类到底是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-15
  • Python到底是个什么东西
     1、Python是一门脚本语言,像awk、tcl、perl、ruby一样,解释执行(可以编译缓存); 2、Python是一个绿色软件,解压即可使用,方便灵活; 3、安装一个Python库非常方便,大部分封装包都带有setup.py,只需要...
    99+
    2023-01-31
    是个什么东西 Python
  • 云服务器到底是什么
    云服务器是一种虚拟的计算服务平台,用户可以通过互联网访问它来存储、管理和访问数据、应用程序和其他资源。云服务器通常包括许多功能,例如弹性存储、备份和恢复、负载均衡和安全管理等。 云服务器是一种高性能、可靠的计算服务,它可以提供高速、可靠的...
    99+
    2023-10-26
    到底是什么 服务器
  • c++ set遍历的方法是什么
    在C++中,可以使用迭代器或者范围循环来遍历Set。1. 使用迭代器遍历Set:```cpp#include #include in...
    99+
    2023-09-15
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作