3.1 序列式容器-vector

news2024/11/15 8:10:09

STL中一些常见的容器:

  1. 序列式容器(Sequence Containers)

    • vector(动态数组): 动态数组,支持随机访问和在尾部快速插入/删除。
    • list(链表): 双向链表,支持在任意位置快速插入/删除。
    • deque(双端队列): 双端队列,支持在两端快速插入/删除。

    容器适配器(Container Adapters):

    • stack(栈): 后进先出(LIFO)的数据结构。
    • queue(队列): 先进先出(FIFO)的数据结构。
    • priority_queue(优先队列): 具有优先级的队列。

  2. 关联式容器(Associative Containers)

    • set(集合): 有序集合,不允许重复元素。
    • multiset(多重集合): 有序集合,允许重复元素。
    • map(映射): 键-值对的集合,按键有序存储,不允许重复键。
    • multimap(多重映射): 键-值对的集合,按键有序存储,允许重复键。

    无序关联容器(Unordered Associative Containers):

    • unordered_set: 无序集合,不允许重复元素。
    • unordered_multiset: 无序集合,允许重复元素。
    • unordered_map: 无序映射,按键无序存储,不允许重复键。
    • unordered_multimap: 无序映射,按键无序存储,允许重复键。

序列式容器

1.vector

1.1定义

C++本身提供了一个序列容器array数组,STL中新增了一个vector,被称为动态数组。

它与array的区别是它提供了动态空间大小。

例如:

std::array<int, 5> myArray = {1, 2, 3, 4, 5};
std::vector<int> myVector = {1, 2, 3, 4, 5};

1.2迭代器

vector的迭代器所需功能,普通指针就能满足,所以在vector容器中,迭代器就是普通指针,并且其类型属于随机访问迭代器,支持跳跃式的访问。支持++,—,+=,-=等操作运算。

所以vector容器元素的访问的时间复杂度是O(1).

1.2数据结构

vector的数据结构是一块连续的线性空间。其中以两个迭代器start和finish分别指向配置得来的连续空间中已被使用的范围,以迭代器end_of_storage指向整块连续空间的尾端:

template <class T,class Alloc=alloc>
class vector
{
    ...
protected:
    
    iterator start;//目前使用的空间的头部
    
    iterator finish;//目前使用的空间的尾部
    
    iterator end_of_storage; //目前可用空间的尾部 
...
}

为了减少空间动态配置时的成本,vector实际配置的大小(capacity)可能比需求更大一些,以备将来可能的扩充。vector这里就有一个容量capacity的概念。和vector大小size的概念对应。vector的容量永远大于或等于其大小。一旦容量等于大小,便是满载,下次再有新增元素,整个vector就要进行转移。
在这里插入图片描述
在这里插入图片描述

1.3vector的push_back(如何动态增长)

在这里插入图片描述
其中核心点在于insert_aux函数

template <class T,class Alloc>
void vector<T,Alloc>::insert_aux(iterator position,const T& x)
{   
    //检查是否还有备用空间
    if(finish!=end_of_storage){
        //在备用空间起始处构造一个元素,并以vector最后一个元素为其初始值
        construct(finish,*(finish-1));
        //移动finish指针
        ++finish;
        //拷贝内容
        T x_copy=x;
        //执行拷贝
        copy_backward(position,finish-2,finish-1);
        *position=x_copy;
    }else {
        //进入这里表示已经不存在可用空间
        const size_type old_size=size();
        //决定分配空间的大小
        const size_type len=old_size!=0?2*old_size:1;
        //实际分配
        iterator new_start=data_allocator::allocate(len);
        iterator new_finish=new_start;
        try{
            //拷贝元素
            new_finish=uninitialized_copy(start,position,new_start);
            //为新元素设定初值x
            construct(new_finish,x);
            //调整指针位置
            ++new_finish;
        }catch(...){
            destroy(new_start,new_finish);
            data_allocator::deallocate(new_start,len);
            throw;
        }
        //释放原来的内存
        destroy(begin(),end());
        deallocate();
        //调整迭代器,指向新vector
        start=new_start;
        finish=new_finish;
        end_of_storage=new_start+len;
    }
}

可以看出来vector所谓的动态增加大小,并不是在原有空间之后接新的空间(因为无法保证原空间之后还有连续的可配置空间),而是以原大小的两倍来另外配置一块较大的空间,然后再将原有内容拷贝过来,并释放原空间。因此需要注意的是vector一旦引起了的空间重新配置,指向原vector的所有迭代器都失效了。

1.4vector的pop_back、erase、insert

pop_back和erase比较简单,如下所示:
在这里插入图片描述

  • insert存在三种情况。

例如插入代码insert(iter, 2, 1),表示从位置iter开始插入,插入2个为1的数。

  1. 插入n个数后,没有引发动态配置空间。且插入的数量大于插入点之后的现有元素个数;
  2. 插入n个数后,没有引发动态配置空间。且插入的数量小于等于插入点之后的现有元素个数;
  3. 插入n个数后,引发了动态配置空间。

3种情况的源码和示意图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由于是在原有的空间上来构造插入数据,没有生成多余的临时变量(尽可能地压榨性能),所以会有以上两种情况。
在这里插入图片描述
三种情况插入都会引发迭代器失效问题,前两种会导致position之后的所有迭代器均失效,最后一种情况会导致所有迭代器失效。

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

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

相关文章

Unity3d Shader篇(十一)— 遮罩纹理

文章目录 前言一、什么是遮罩纹理&#xff1f;1. 遮罩纹理工作原理2. 遮罩纹理优缺点优点&#xff1a;缺点&#xff1a; 3. 遮罩纹理图 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数 三、效果四、总结 前言 在…

springboot基于web的音乐网站论文

音乐网站 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了音乐网站的开发全过程。通过分析音乐网站管理的不足&#xff0c;创建了一个计算机管理音乐网站的方案。文章介绍了音乐网站的系统分析部分&#xff0c…

C++_运算符_算数运算符

运算符作用 用于执行代码的运算 算数运算符作用 用于处理四则运算 算术运算符包括以下符号 示例 加减乘除 取模运算 前置递增、递减&#xff0c;后置递增、递减

【C初阶】预处理

前言&#xff1a;在本文中&#xff0c;我将系统的整理一下C语言关于预处理部分的语法&#xff0c;便于整理与回归。 1.预定义符号 在C语言中&#xff0c;C标准提供里一些C预定义符号&#xff0c;在预处理期间完成&#xff0c;可以直接使用。 有如下几个符号&#xff1a; 2.#…

AI硬件暴涨的一晚

DELL 31% 引爆AI&#xff0c;都在寻找catch-up plays 软件和云都没咋动&#xff0c;硬件尤其是Semi全在涨。NVDA4%&#xff0c;AMD5%&#xff0c;MRVL8%&#xff0c;西部数据8%&#xff0c;博通7%&#xff08;Oppenheimer、BofA提目标价&#xff09;&#xff0c;台积电4%&…

AI技术大揭秘!你不可不知的顶级大模型

在这个数字化飞速发展的时代&#xff0c;AI大模型以其惊人的应用范围和深远的影响力&#xff0c;正逐渐成为各行各业的革命性力量。想象一下&#xff0c;在一个晴朗的午后&#xff0c;一个智能客服系统正轻松地处理着成千上万的客户咨询&#xff0c;不仅回答速度快捷&#xff0…

【Logback】Logback 的配置文件

目录 一、初始化配置文件 1、logback 配置文件的初始化顺序 2、logback 内部状态信息 二、配置文件的结构 1、logger 元素 2、root 元素 3、appender 元素 三、配置文件中的变量引用 1、如何定义一个变量 2、为变量设置默认值 3、变量的嵌套 In symbols one observe…

Vue开发实例(七)Axios的安装与使用

说明&#xff1a; 如果只是在前端&#xff0c;axios常常需要结合mockjs使用&#xff0c;如果是前后端分离&#xff0c;就需要调用对应的接口&#xff0c;获取参数&#xff0c;传递参数&#xff1b;由于此文章只涉及前端&#xff0c;所以我们需要结合mockjs使用&#xff1b;由于…

基于CNN-LSTM-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 长短时记忆网络&#xff08;LSTM&#xff09;处理序列依赖关系 4.3 注意力机制&#xff08;Attention&#xff09; 5…

EasyRecovery16电脑硬盘数据恢复软件功能详解

在数字化时代&#xff0c;人们在日常生活和工作中越来越依赖于电脑和移动设备。不管是个人用户还是企业&#xff0c;数据的重要性都不言而喻。然而&#xff0c;数据丢失和损坏的风险也随之增加&#xff0c;因此&#xff0c;数据恢复软件的需求也日益增长。 EasyRecovery 16是一…

小程序和页面生命周期详解

目录 小程序的生命周期 创建&#xff08;onLoad&#xff09;&#xff1a; 显示&#xff08;onShow&#xff09;&#xff1a; 隐藏&#xff08;onHide&#xff09;&#xff1a; 卸载&#xff08;onUnload&#xff09;&#xff1a; 错误监听&#xff08;onError&#xff09;…

数据分析-Pandas数据的探查面积图

数据分析-Pandas数据的探查面积图 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&…

【深入了解设计模式】组合设计模式

组合设计模式 组合模式是一种结构型设计模式&#xff0c;它允许你将对象组合成树状结构来表现“整体-部分”关系。组合模式使得客户端可以统一对待单个对象和组合对象&#xff0c;从而使得代码更加灵活和易于扩展。 概述 ​ 对于这个图片肯定会非常熟悉&#xff0c;上图我们可…

python 基础知识点(蓝桥杯python科目个人复习计划57)

今日复习计划&#xff1a;做题 例题1&#xff1a;笨笨的机器人 问题描述&#xff1a; 肖恩有一个机器人&#xff0c;他能根据输入的指令移动相应的距离。但是这个机器人很笨&#xff0c;他永远分不清往左边还是往右边移动。肖恩也知道这一点&#xff0c;所以他设定这个机器人…

红外电力设施检测数据集

需要的同学私信联系&#xff0c;推荐关注上面图片右下角的订阅号平台 自取下载。 红外检测技术目标检测准确、速度快、涵盖面积广&#xff0c;可以在不停电、不接触、不解体、不采样的状态下&#xff0c;对带电设备的状态进行检测和诊断&#xff0c;精确查找出设备的劣化程度、…

springboot+vue小区物业管理系统

摘 要 随着我国经济发展和城市开发&#xff0c;人们对住房的需求增大&#xff0c;物业管理也得到了发展。但是&#xff0c;基于人工的物业管理仍然是现阶段我国大部分物业管理公司的管理模式&#xff0c;这种管理模式存在管理人员效率低下、工作难度大的问题&#xff0c;同时…

SpringCloudAlibaba介绍

Spring Cloud Alibaba Spring Cloud Alibaba 是什么&#xff1f;微服务全景图核心特色 大家好&#xff0c;我叫阿明。下面我会为大家准备Spring Cloud Alibaba系列知识体系&#xff0c;结合实战输出案列&#xff0c;让大家一眼就能明白得技术原理&#xff0c;应用于各公司得各…

用冒泡排序模拟C语言中的内置快排函数qsort!

目录 ​编辑 1.回调函数的介绍 2. 回调函数实现转移表 3. 冒泡排序的实现 4. qsort的介绍和使用 5. qsort的模拟实现 6. 完结散花 悟已往之不谏&#xff0c;知来者犹可追 创作不易&#xff0c;宝子们&#xff01;如果这篇文章对你们有帮助的话&#xff0c;别忘了给个免…

Windows批处理:bat文件学习

目录 第一章、快速了解Windows批处理1.1&#xff09;Windows批处理相关概念介绍1.1.1&#xff09;批处理的起源1.1.2&#xff09;bat文件介绍 1.2&#xff09;Demo1.2.1&#xff09;创建文件添加命令1.2.2&#xff09;bat脚本中的命令解释 第二章、实例2.1&#xff09;点击bat文…

排序——手撕快排

本节复习快速排序&#xff0c; 快排我们要讲三个版本&#xff1a;一种是霍尔大佬的原版版本&#xff0c; 也就是快速排序的原版。 一种挖坑法。还有一种前后指针法。 首先我们应该知道&#xff0c;三个版本针对的是单趟进行排序的方法不同。 而多趟使用的是递归或者非递归模拟…