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

news2024/12/31 3:32:14

文章目录

  • 数组
    • 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.coloradmin.cn/o/1461561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C->Cpp】由C迈向Cpp(4)

目录 (一)内联函数 (二)关键字auto (三)范围for (四)nullptr 正文开始: (一)内联函数 宏定义: C的内联函数是在C语言宏的基础上提出…

怎样开发Apple Vision Pro应用?以应用开发者角度体验苹果的开发文档

▲ 搜索“大龙谈智能内容”关注公众号▲ 最近,苹果公司推出了革命性的产品Apple Vision Pro,全世界震惊。下边这个视频在社交网络上得到了大量转发: 在大家兴奋的围观之际,已经有人在规划能做些什么了。 有朋友问大龙有什么Vi…

妨碍做出正确决策的5种认知谬误

人类的大脑在极端情况下会呈现出不可理喻的一面,从而妨碍我们做出正确的决策。本文介绍了5种常见的认知谬误,识别并克服这些认知谬误,可以帮助我们更好的决策。原文: Want to Make Better Decisions? Avoid These 5 Cognitive Distortions 我…

Python中类创建和实例化过程

嗨喽,大家好呀~这里是爱看美女的茜茜呐 一、 type() 1、创建类的两种方式 方式一 class MyClass(object):def func(self,name):print(name)myc MyClass()print(MyClass, type(MyClass)) print(myc, type(myc))我们创建了一个名为MyClass的类,并实例化…

书生·浦语大模型实战营-第四课笔记

期待已久的微调课 一、Finetune 增量预训练和指令跟随是两种微调模式,即两种微调策略。 1)增量预训练 投喂新的领域知识即可,例如书籍、文章、代码 2)指令跟随 采用高质量对话和问答数据进行训练 二、LoRA与QLoRA 两…

35、IO进程线程/多线程实现文件读写20240221

一、使用多线程完成两个文件的拷贝&#xff0c;第一个线程拷贝前一半&#xff0c;第二个线程拷贝后一半&#xff0c;主线程回收两个线程的资源。 代码&#xff1a; #include<myhead.h> typedef struct //类型重定义结构体 {const char *src;const char *dest;int start…

vue3总结

1 setup 概述 setup是Vue3中一个新的配置项个函数, 包含数据、方法等&#xff0c;是组合api的“舞台”。 特点如下&#xff1a; setup函数返回的对象中的内容&#xff0c;可直接在模板中使用。setup中访问this是undefined。setup函数会在beforeCreate之前调用&#xff0c;它…

人工智能深度学习

目录 人工智能 深度学习 机器学习 神经网络 机器学习的范围 模式识别 数据挖掘 统计学习 计算机视觉 语音识别 自然语言处理 机器学习的方法 回归算法 神经网络 SVM&#xff08;支持向量机&#xff09; 聚类算法 降维算法 推荐算法 其他 机器学习的分类 机器…

Spring Cloud Gateway 中文文档

Spring Cloud Gateway 中文文档 官方文档 该项目提供了一个建立在Spring Ecosystem之上的API网关&#xff0c;包括&#xff1a;Spring 5&#xff0c;Spring Boot 2和Project Reactor。 Spring Cloud Gateway旨在提供一种简单而有效的方式来对API进行路由&#xff0c;并为他们提…

奇异递归模板模式应用5-静态多态

动态多态&#xff1a;C动态多态是利用虚函数特性实现的&#xff0c;即基类指针(引用&#xff09;指向派生类指针(引用)。由于虚函数的实现是在运行期进行的&#xff0c;因而会产生运行期开销&#xff08;虚表指针偏移&#xff0c;与分支预测器和CPU指令流水线相关&#xff09;。…

window10中安装Docker Desktop(2024最新)

1、安装概述? 博客创造时间:2024年2月20日。 Docker在Linux中的安装相对较简单,但是在window中的安装总是会出现很多的问题。 新版本Docker Desktop安装的前提条件: 1、现在Docker Desktop默认使用WSL 2,而不是以前的Hyper-V。 2、检查系统要求:系统最好是Windows 1…

UE4 C++联网RPC教程笔记(三)(第8~9集)完结

UE4 C联网RPC教程笔记&#xff08;三&#xff09;&#xff08;第8~9集&#xff09;完结 8. exe 后缀实现监听服务器9. C 实现监听服务器 8. exe 后缀实现监听服务器 前面我们通过蓝图节点实现了局域网连接的功能&#xff0c;实际上我们还可以给项目打包后生成的 .exe 文件创建…

【优选算法专栏】专题九:链表--------两两交换链表中的节点

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

华清远见作业第四十天——Qt(第二天)

思维导图&#xff1a; 编程&#xff1a; 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为…

智慧园区软件解决方案,园区运营管理系统(源码)

一、楼栋管理 1、园区信息&#xff1a;描述园区信息&#xff0c;有些规模较大的产业园区会存在A区&#xff0c;B区&#xff0c;C区。 2、楼栋信息&#xff1a;管理园区所有的楼栋&#xff0c;设有楼栋编号&#xff0c;所属园区&#xff0c;楼栋地址等。 3、房源信息&#xf…

JAVA并发编程之原子性、可见性与有序性

并发编程-原子性、可见性与有序性 一、CPU的可见性 1.1 缓存一致性问题的出现 CPU处理器在处理速度上&#xff0c;远胜于内存&#xff0c;主内存执行一次内存的读写操作&#xff0c;所需要的时间足够处理器去处理上百条指令。 为了弥补处理器与主内存处理能力之间的差距&am…

计算机网络基础之计算机网络组成与分类

计算机网络基础 计算机网络是计算机技术与通信技术发展相结合的产物&#xff0c;并在用户需求的促进下得到进一步的发展。通信技术为计算机之间的数据传输和交换提供了必需的手段&#xff0c;而计算机技术又渗透到了通信领域&#xff0c;提高了通信网络的性能。 计算机网络的…

书生·浦语大模型实战营-第六课笔记

1.评测追魂夺命三连问 2.主流大拿有话说-评测框架 3.友商最棒儿子最亲&#xff0c;好瓜都是王婆的 4.真枪实弹上战场 为了给平台省点电&#xff0c;我用了自家的电和自家的电脑进行评测。评测的模型也是之前在自己电脑上跑了3轮花费30多个小时的第四课作业微调的法律大模型。s…

Kotlin学习 6

1.接口 interface Movable {var maxSpeed: Intvar wheels: Intfun move(movable: Movable): String}class Car(var name: String, override var wheels: Int 4, _maxSpeed: Int) : Movable {override var maxSpeed: Int _maxSpeedget() fieldset(value) {field value}overr…

相机图像质量研究(40)常见问题总结:显示器对成像的影响--画面泛白

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…