C++基础知识(十四)--- vector容器

2023-11-14

目录

1. 数据结构:线性连续空间。

2. 迭代器:随机迭代器。

三. vector容器动态增长原理:

四. vector 常用API:

1. vector 构造函数

2. vector 赋值操作

3. vector 大小操作

swap 的使用:缩小容量

4. vector 数据存取操作

5. vector 插入和删除操作 

6. 注意:


vector 的数据安排以及操作方式,与 array 非常相似,差别在于:

  • array 是静态空间;
  • vector 是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。

1. 数据结构:线性连续空间。

Vector 以两个两个迭代器 _Myfirst 和 _Mylast 分别指向配置得来的连续空间中目前已使用的范围,并以迭代器 _Myend 指向整块连续内存空间的尾端。

2. 迭代器:随机迭代器。

vector 维护一个线性空间,不论元素的类型如何,普通指针都可以作为vector的迭代器。因为vector迭代器所需要的操作行为,如:operator->,operator++,operator+=等,普通指针天生具备。vector 支持随机存取,而普通指针正有这个能力。所以vector提供的是随机访问迭代器(Random Access Iterators)。

由此,可知

Vector<int>::iterator a;
Vector<Maker>::Iterator b;

a 的类型其实就是 int*,b 的类型就是 Maker*。

三. vector容器动态增长原理:

① 当存储空间不够时,会另开辟一块大的空间,然后把数据拷贝过去,最后销毁原来的空间;

② 申请的空间,会比用户需求大一点;

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

四. vector 常用API:

1. vector 构造函数

vector<T> v;                 //采用模板实现类实现,默认构造函数
vector(v.begin(), v.end());  //将v[begin(), end()]区间中的元素拷贝给本身
vector(n, elem);             //构造函数将n个elem拷贝给本身
vector(const vector& vec);   //拷贝构造函数

2. vector 赋值操作

assign(begin, end);   //将[begin, end)区间中的数据拷贝赋值给本身
assign(n, elem);      //将n个elem拷贝赋值给本身
vector&operator=(const vector  &vec);  //重载等号操作符
swap(vec);            // 将vec与本身的元素互换

3. vector 大小操作

size();     //返回容器中元素的个数
empty();    //判断容器是否为空
resize(int num);  //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
                  //如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num, elem);  //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
                        //如果容器变短,则末尾超出容器长度的元素被删除。
capacity();  //容器的容量
reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可访问。

swap 的使用:缩小容量

① capacity 比 size 略微大点;

② resize 只减小了size,capacity 并没有变;

③ 调用拷贝构造,v2的 capacity 减小;

④ 可看成是:vector<int>v2(v).swap(v); 只是把匿名对象的名字隐藏了。

4. vector 数据存取操作

at(int idx);  //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
operator[];   //返回索引idx所指的数据,越界时,运行直接报错
front();      //返回容器中第一个数据元素
back();       //返回容器中最后一个数据元素

 

5. vector 插入和删除操作 

insert(const_iterator pos, int count,ele); //迭代器指向位置pos插入count个元素ele.
push_back(ele);    //尾部插入元素ele
pop_back();        //删除最后一个元素
erase(const_iterator start, const_iterator end);  //删除迭代器从start到end之间的元素
erase(const_iterator pos);  //删除迭代器指向的元素
clear();  //删除容器中所有元素

 

6. 注意:

resize:开辟空间并初始化;

reserve:开辟空间,但不初始化,没有初始化的空间不能访问。如果容器要存储大量数据时,要先开辟空间,避免多次申请空间。

swap:缩小容器的容量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++基础知识(十四)--- vector容器 的相关文章

随机推荐

  • 第3关:文件查看器

    编程要求 实现对给定文件夹目录结构的展示 并以文件名按升序排序的形式打印至控制台 如果是文件夹则在其名字之前加上 若是文件则加上 上级目录与下级目录 下级文件用两个空格作为间隔 补充完善右侧代码区中的showDirStructure Fil
  • 【经典】synergy共享鼠标键盘/一套鼠标键盘操作多台电脑

    使用场景 用一套鼠标键盘控制两个或多个电脑屏幕 所有电脑位于同一局域网下 win10 操作系统 安装 synergy step1 下载 下载地址 synergy step2 安装 选择自己想要安装在的目录然后一直 next 最后 finis
  • java生成PDF(图片,模板,表格)

    刚接到了一个需求 生成一个pdf 一开始以为挺简单的 通过模板生成嘛 我也发过相应的文章 根据模板直接生成pdf 响应到前端或者根据模板生成pdf 直接指定下载位置 这两种方案都可以 不过这篇文章主要讲的生成的pdf是既有模板填充还需要自己
  • hdu 2586 How far away ?

    Problem acm hdu edu cn showproblem php pid 2586 Meaning 给一棵 n 个点的树 和 n 1 条边的边权 多次询问树上两点的距离 Analysis 以任意顶点为根 DFS 预处理出所有结点
  • 【数据库MongoDB的学习】

    一 数据库和文件的主要区别 1 数据库有数据库表 行和列的概念 让我们存储操作数据更方便 2 数据库提供了非常方便的接口 可以让 nodejs php java net 很方便的实现增加修改删 除功能 二 关系型和非关系型数据库的介绍 关系
  • 深度学习数字仪表盘识别_一种改进的卷积神经网络的数显仪表识别方法

    数显仪表 就是一种显示数字的仪器 便于人们了解相关信息 目前 数显仪表被广泛的应用于航天 农业 工业等各个行业中 但出于工作条件和成本控制等原因 仍有很多的仪表无法直接获得读数 大多由人工读取 但是人工无法长时间且实时记录 还有些地方工人不
  • Deepin操作系统丨一台10年前的家用联想台式机重装国产Linux系统,制作成生信服务器

    本篇笔记是利用个人电脑搭建Linux系统 deepin 20 8 的教程 包括系统下载 映像刻录 启动盘制作 电脑BIOS设置 安装系统 故障解决 驱动更新 软件下载 conda配置 R语言和Rstudio server配置 远程SSH配置
  • 【深度学习】入门的25个概念

    神经网络基础 1 神经元 Neuron 就像形成我们大脑基本元素的神经元一样 神经元形成神经网络的基本结构 想象一下 当我们得到新信息时我们该怎么做 当我们获取信息时 我们一般会处理它 然后生成一个输出 类似地 在神经网络的情况下 神经元接
  • R ggplot2坐标轴设置相关函数

    1 设置坐标轴标签 xlab ylab labs x NULL y NULL 2 设置坐标轴刻度范围 xlim ylim 3 添加标题 ggtitle 4 theme 控制字体 坐标轴刻度 背景以及背景上的线条 4 1 在theme 内部有
  • 出现—passwd:Authentication token manipulation error—错误的解决办法

    在服务器安装过程中 经常遇到软件安装失败 有一部分原因是在linux系统禁止添加新的用户和修改原有用户 在网上找了一篇解决此问题的文章 特转到此处作为参考 文章 http blog sina com cn s blog 70c9c4b401
  • AI数字人:基于VITS-fast-fine-tuning构建多speaker语音训练

    1 VITS模型介绍 VITS Variational Inference with adversarial learning for end to end Text to Speech 是一种语音合成方法 它使用预先训练好的语音编码器 v
  • import cv2 ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: P

    usr bin python3 5 home utryjc PycharmProjects qtWayPionts ui main py Traceback most recent call last File home utryjc Py
  • 【PTA】斐波那契数列第n项

    求斐波那契数列的第n项 f n f n 1 f n 2 其中f1 f2 1 import java util public class Main public static void main String args Scanner sca
  • 加密so文件中指定的函数

    加密so文件中指定的函数 作者 0n1y3nd丶 分类 逆向学习 发布时间 2014 09 04 22 24 61条评论 前言 上一篇文章中详细分析了对so文件中自定义section的加密 这一篇来分析下对so文件中自定义函数的加密 原文地
  • 拉格朗日乘子法和KKT条件

    拉格朗日乘子法 Lagrange Multiplier 和KKT Karush Kuhn Tucker 条件是求解约束优化问题的重要方法 在有等式约束时使用拉格朗日乘子法 在有不等约束时使用KKT条件 前提是 只有当目标函数为凸函数时 使用
  • 【吴恩达-AIGC/ChatGPT提示工程课程】第六章 - 文本转换 Transforming

    吴恩达 AIGC ChatGPT提示工程课程 第六章 文本转换 Transforming 1 引言 LLM非常擅长将输入转换成不同的格式 例如多语种文本翻译 拼写及语法纠正 语气调整 格式转换等 本章节将介绍如何使用编程的方式 调用API接
  • C语言实现求解斐波那契数列的四种方法及优化处理(递归,迭代,特殊性质公式,矩阵快速幂)

    众所周知 斐波那契数列是非常经典的一个数列 它的数学公式如下 为了便于观察 我们列出它的几项 0 1 1 2 3 5 8 13 21 下面我们将介绍四种方法来用C语言计算机代码实现对斐波那契数列的求解 分别是 递归法 迭代法 矩阵求解法以及
  • 进厂拧了4年螺丝,零基础自学python月入过万,一切都来之不易

    前言 种子放在水泥板上就会被晒死 放在水里就会被淹死 但是放在肥沃的土壤里 就会生根发芽 选择可以决定命运 环境可以造就人生 今天给大家分享一位从工厂到程序员小哥的逆袭之路 就是这样一个在朋友眼里的满是羡慕的高薪工作 或许只有只有我自己 才
  • 在 Mac 上升级 pip

    遇到的问题 终端安装包时 会有以下提示 pip install upgrade pip WARNING You are using pip version 20 2 3 however version 21 0 1 is available
  • C++基础知识(十四)--- vector容器

    目录 1 数据结构 线性连续空间 2 迭代器 随机迭代器 三 vector容器动态增长原理 四 vector 常用API 1 vector 构造函数 2 vector 赋值操作 3 vector 大小操作 swap 的使用 缩小容量 4 v