基础数据结构与相关C++ STL容器

文章目录

  • 数组
    • array
    • vector
  • 栈和队列
    • deque
    • stack
    • queue
    • heap
    • priority_queue
  • 链表
    • list
    • forward_list
    • set
    • map
    • multiset
    • multimap
  • 哈希表
    • unordered_set
    • unordered_map
    • unordered_multiset
    • unordered_multimap

数组

array

不开口的连续线性空间,支持随机访问。
在这里插入图片描述

array是C++11中新提出来的容器类型,它继承了数组最基本的特性,同时也融入了很多容器操作,容器化使得array可以严格检查越界读写,因此与C语言数组相比,array更加安全,可以用来替代C语言数组。作为C语言数组的升级版,array和数组一样,是一种固定大小的容器类型,在定义的时候就要声明大小和类型。无法动态的扩展或收缩,只允许访问或者替换存储的元素。

array的数据存储在栈中,因此处理数据的效率快于vector,但是由于需要考虑栈溢出问题,array只适合一些操作简单、数据量较少的情况。

  • array支持的操作

在这里插入图片描述

vector

单向开口的连续线性空间,支持随机访问。
在这里插入图片描述

动态空间,随着新元素的加入,它的内部机制会自行扩充空间以容纳新元素。

扩充空间=配置新空间+数据移动+释放旧空间。

vector维护的是连续线性空间,其指针就是普通指针。

为了降低频繁空间配置带来的成本开销,vector实际配置的大小会比客户需求的更大一些,以备将来可能的扩充。

所谓动态增加大小,并不是在原空间之后接续新空间(因为无法保证原空间之后有可供配置的空间),而是以原空间大小的两倍另外配置一块较大空间,然后将原内容拷贝过来,然后才开始在原内容后边构造新元素,并释放原空间。

因此,对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了。

  • vector常见操作如下

在这里插入图片描述
在这里插入图片描述

栈和队列

deque

双向开口的连续线性空间,支持随机访问。

在这里插入图片描述
在这里插入图片描述

  • deque支持的操作
    在这里插入图片描述
    在这里插入图片描述

stack

一端开口的连续线性空间,不支持随机访问。

FILO(先进后出)

在这里插入图片描述

将deque的头端开口关闭,就形成了一个stack。

  • stack支持的操作

在这里插入图片描述

queue

头尾两端单向开口的连续线性空间,不支持随机访问。

FIFO(先进先出)

在这里插入图片描述

将deque头端的入口和尾端的出口关闭,就形成了一个queue。

  • queue支持的操作

在这里插入图片描述

heap

一种用数组表述完全二叉树的方式,分为大根堆和小根堆。

heap=vector+heap算法。

heap并非STL的容器组件,而是以算法形式呈现,作为priority_queue的幕后助手。

在这里插入图片描述

priority_queue

priority_queue使用vector作为其底层存储数据的容器,在vector上又使用了heap算法将vector中元素构造成堆的结构,因此priority_queue是C++ STL提供的堆容器。

priority_queue是一个queue,所以只允许在底端加入元素,并从顶端取出元素。

其元素并非依照被推入队列的顺序排列。而是自动依照元素的权值排列。默认为大根堆,即权值最高者排在最前面。

在这里插入图片描述

  • priority_queue支持的操作:

在这里插入图片描述

链表

list

list是环状双向链表。

在这里插入图片描述

  • list常见操作

在这里插入图片描述
在这里插入图片描述

forward_list

forward_list是单向链表。

在这里插入图片描述

  • forward_list常见操作

在这里插入图片描述
在这里插入图片描述

二叉搜索树(BST)提供对数时间的元素插入和访问。其节点放置规则是:任何节点的值一定大于其左子树中每一节点的值,并小于其右子树中每一节点的值。故其中序遍历为递增序列。

平衡二叉搜索树要求没有任何一个节点过深,即加了平衡条件的二叉搜索树。包括AVL树和红黑树等。

  • AVL树要求任何节点的左右子树高度相差最多1。

  • 红黑树在二叉搜索树的基础上,添加以下规则:

    1. 节点分为红色和黑色;
    2. 根节点为黑色;
    3. 如果节点为红色,则其子节点必须为黑色;
    4. 任一节点至NULL的任何路径,所含黑色节点数必须相同。

set、map、multiset、multimap均以红黑树为底层结构。

set

set的所有元素会根据其键值自动被排序。

set的键值(key)就是实值(value),实值就是键值。

set不允许两个元素有相同的键值。

因为set的元素值关系到其排列规则,所以不能通过set的迭代器改变set的元素值,

map

map的所有元素会根据其键值自动被排序。

map的所有元素都是pair,同时拥有键值key和实值value。

map不允许两个元素有相同的键值。

可以通过map的迭代器修改map元素的实值value,但不能修改元素的键值key,因为键值key关系到map元素的排列规则。

multiset

multiset与set的唯一差别:multiset允许键值重复,而set不允许。

multimap

multimap与map的唯一差别:multimap允许键值重复,而map不允许。

哈希表

哈希表中元素的存储位置由元素的key值和Hash函数共同确定,Hash函数根据元素的key值计算出该元素应在的位置。
A d d r e s s = H a s h ( k e y ) Address = Hash(key) Address=Hash(key)
哈希碰撞问题:不同的元素被映射到相同的位置。

哈希碰撞解决方法:

  • 线性探测法:Hash出的位置H不可用时,往下一一寻找H+1、H+2、…、H+i,直到找到一个可用空间为止。
  • 二次探测法:Hash出的位置不可用时,往下一一寻找H+1、H+4、…、H+i*i,直到找到一个可用空间为止。
  • 开链法:Hash出的每个位置都维护一个链表。SGI STL采用此法。如下图所示。

在这里插入图片描述

unordered_set、unordered_map、unordered_multiset、unordered_multimap均以哈希表为底层结构。

unordered_set

unordered_set与set的唯一差别:unordered_set内的元素不会被自动排序,而set会。

unordered_map

unordered_map与map的唯一差别:unordered_map内的元素不会被自动排序,而map会。

unordered_multiset

unordered_multiset与multiset的唯一差别:unordered_multiset内的元素不会被自动排序,而multiset会。

unordered_multiset与unordered_set的唯一差别:unordered_multiset允许键值重复,而unordered_set不允许。

unordered_multimap

unordered_multimap与multimap的唯一差别:unordered_multimap内的元素不会被自动排序,而multimap会。

unordered_multimap与unordered_map的唯一差别:unordered_multimap允许键值重复,而unordered_map不允许。

暂不了解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/484758.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【xss跨站漏洞】xss漏洞利用工具beef的安装

安装环境 阿里云服务器,centos8.2系统,docker docker安装 前提用root用户 安装docker yum install docker 重启docker systemctl restart docker beef安装 安装beef docker pull janes/beef 绑定到3000端口 docker run --rm -p 3000:3000 janes/beef …

HTTP与HTTPS-HTTPS 的应用数据是如何保证完整性的?

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) HTTPS 的应用数据是如何保证完整性的? TLS 在实现上分为握手协议和记录协议两层 TLS 握手协议就是我们前面说的 TLS 四次握手的过程,负责协商加密算法和生成对称密钥,后续用此密…

【CVE-2024-21626】容器逃逸漏洞修复

哈喽大家好,我是咸鱼。 好久不见,最近有一个很火的 CVE——runc 容器逃逸漏洞。年前的时候我们已经在测试环境进行了相关操作打算年后线上进行修复。 因为今天咸鱼才开工,所以文章也就拖到了现在 😃 漏洞介绍 简单来讲&#xf…

MongoDB学习笔记

1. 写在前面 最近工作用到了Mongodb,虽然有了gpt,对于这种数据库操作的代码基本上不用自己费多大功夫,但对于知识本身,还是想借机会系统学习下Mongodb的,原因是之前接触数据库一直都是mysql,oracle等关系型…

Redis篇----第三篇

系列文章目录 文章目录 系列文章目录前言一、缓存雪崩**二、缓存穿透三、缓存预热四、缓存更新五、缓存降级 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女…

Sora:打开视频创作新纪元的魔法钥匙

随着人工智能技术的飞速发展,AI视频模型已成为科技领域的新热点。而在这个浪潮中,OpenAI推出的首个AI视频模型Sora,以其卓越的性能和前瞻性的技术,引领着AI视频领域的创新发展。让我们将一起探讨Sora的技术特点、应用场景以及对未…

环境规制滞后一期数据集(2002-2020年)

时间范围:2002-2020年 参考文献: [1] 纪小乐, 薛启航, 魏建. 环境规制与数字经济:中国南北经济差异的诱致与扩大因素分析[J]. 中国人口资源与环境, 2023, 33 (12): 94-108. [2] 邹志明, 陈迅. 外商直接投资对技术创新与经济高质量发展的影…

qt-OPENGL-星系仿真

qt-OPENGL-星系仿真 一、演示效果二、核心程序三、下载链接 一、演示效果 二、核心程序 #include "model.h"Model::Model(QOpenGLWidget *_glWidget) { glWidget _glWidget;glWidget->makeCurrent();initializeOpenGLFunctions(); }Model::~Model() {destroyV…

Flink双流(join)

一、介绍 Join大体分类只有两种:Window Join和Interval Join Window Join有可以根据Window的类型细分出3种:Tumbling(滚动) Window Join、Sliding(滑动) Window Join、Session(会话) Widnow Join。 🌸Window 类型的join都是利用window的机制…

SpringIOC之support模块StaticApplicationContext

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

数据库事物复习

事务 比如说将张三的银行账户拿出一千给李四,首先需要查询张三的账户余额,扣除1000,然后如果给李四加上1000的过程中出现异常会回滚事务,临时修改的数据会回复回去。 -- 1. 查询张三账户余额 select * from account where name …

Leetcode535(设计短网址)

例题: https://leetcode.cn/problems/encode-and-decode-tinyurl/description/ 分析: 题目要求可以将一个长网址变成一个短网址(encode),也可以通过短网址找到原来的长网址,我们可以使用两个hashMap集合来实…