STL vector的N种构造方式

2023-11-02

1 使用默认无参的构造函数进行构造

vector<int> intVect;


观察内存可以看到生成一个带有0个元素的vector时内存中_Myfirst _Mylast _Myend的值均为0,说明vector对象并没有在堆中分配任何存储空间,仅仅是在栈中分配了16字节存储vecotr对象元素,在这16字节中前4字节如果没猜错,应该是一个虚表指针。

Vecotr模版类有三个成员变量

 

_Myfirst  记录在堆分配数组的首地址

_Mylast  记录在堆中分配数组中最后一个有效数据的下一字节地址(不包含有效数据)

_Myend  记录在椎中分配数组末尾元素的下一字节地址(已经超出数组寻址有效范围)


2 使用带一个参数构造的vector对象

vector<int> intVec(5);



Vector构造对象时只有一个参数时

1:分配的堆内存空间会默认全部初始化为0,

2数组空间大小为  参数 * sizeof(元素类型) , 参数指定元素的个数


3使用带两个参数构造的vector对象


1)      第一个参数:指定元素的个数(数组大小)

2)      第二个参数:数组元素全部初始化为第二个参数的值


4 构造元素为自定义类型的vector


同基本数组类型vecotr的构造相似

1)      第一个参数:指定元素的个数(数组大小)

2)      第二个参数:数组元素全部初始化为第二个参数的值


5. C11中新加的构造方式,构造函数接受一个initialize_list参数


通过initialize_list列表中所给的数值以及数值个数分配空间


6 在堆中构造vector


在堆中生成一个vector对象,并返回vector对象在堆中的首地址赋值给一个在栈中指向vector类型的指针

注意使用new分配的vector  要使用 delete 释放  delete pIntVec


7 vector的拷贝构造

vector<int>intVec1 = { 1, 2, 3 };

vector<int>intVec2(intVec1);


Vector的拷贝构造是一个深拷贝,intVec2分配了同intVec1同样大小的内存空间,并把intVec1中的数值拷贝了过来


8 vector的复制运算符重载

在调用赋值运算符之前


调用赋值运算符之后


可以看到intVec2把intVec1中的有效数值全部复制了过来,那么在两个vector大小不同志的情况下又会是什么样呢?


当intvec2.capacity()> intVec1.capacity()时

调用赋值运算符之前



调用赋值运算符后


IntVec2的容量大于intVec1的容量,所以可以直接把intVec1中的数据全部复制过来,而没有必要重新分配空间再复制,提高程序性能。

 

_Myfirst  记录在堆中分配数组的首地址

_Mylast  记录在堆中分配数组中最后一个有效数据的下一字节地址(不包含有效数据)

_Myend  记录在椎中分配数组末尾元素的下一字节地址(已经超出数组寻址有效范围)

 

仔细观察会发现intVec2中的成员变量_Mylast成员变量发生了变化,因为当执行

intVec2 = intVec1 这条语句后,intVec2的状态和行为就和intVec1几无区别,此时虽然intVec2还有两个int内存空间,正是由于_Mylast作为限制,才得以使此时的intVec2的状态和行为与IntVec1相同。  也说明任何一个vector对象的数据都只有在 [_Myfirst,_Mylast) 之间才有效,不包括_Mylast


当intvec2.capacity()< intVec1.capacity()时

调用赋值运算符之前



调用赋值运算符后



当赋值运算符左边的vector对象的capacity小于右边vector对象的capacity时,左边vector对象会释放原来的空间,按运算符右边vector对象的capacity大小重新分配一块新内存空间,并把源vecotr对象的数据复制到新空间中。Vector的赋值运算同样是深拷贝(仅当capacity小于源目标时)




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

STL vector的N种构造方式 的相关文章

随机推荐

  • 使用cobra创建cli命令行工具

    什么是cobra Cobra既是用于创建强大的现代CLI应用程序的库 也是用于生成应用程序和命令文件的程序 Cobra是一个库 提供了一个简单的界面来创建类似于git go工具的强大的现代CLI界面 Cobra也是一个应用程序 它将生成您的
  • Dcat-admin 重写底部版权内容

    Dcat admin 重写底部版权内容 背景 使用 deploy 自动发布项目 无法直观知道发布成功与否 想到可在版权代码位置 添加更新时间来解决该问题 原理 已知 Dcat admin 加载布局文件时候 优先加载 resources vi
  • spring aop @Pointcut语法详解

    转载 https blog csdn net qq 26860451 article details 100554377
  • 各种UI库使用总结

    各种UI库使用总结 工作了这么年 使用了一些UI库 简单的总结一下 UI库也是五花八门 根据自己的产品 应用场景吧 没有绝对合适的 各有各的应用场景吧 QT 这几年前后在一些嵌入式上使用过QT来做为开发 有带UI及不带UI界面的 版本的基本
  • 基于51单片机的羽毛球计分器(含Keil程序和Proteus文件)

    系统概述 系统使用的模块有AT89C51单片机 LCD1602显示屏 矩阵键盘 蜂鸣器 整个羽毛器计分器内的比赛双方的比赛分数和比赛时间和节数等都会在LCD1602显示屏上进行显示 通过左侧的按键可以增加双方的分数 还可以控制比赛的开始和暂
  • 寻找最大整数——从键盘输入四个整数,找出其中的最大值并将其输出

    问题描述 从键盘输入四个整数 找出其中的最大值并将其输出 输入说明 输入4个整数 用空格分隔 输出说明 输出值最大的一个整数 输入样例 25 99 46 0 输出样例 99 include
  • 编程实现朴素贝叶斯分类算法

    from sklearn datasets import load iris iris load iris from sklearn naive bayes import GaussianNB 高斯分布型 gnb GaussianNB 构造
  • Chapter4 Duality theory对偶理论--Introduction to linear optimization

    组会讲稿 传到这里分享下
  • 未名湖边的烦恼 蓝桥杯

    问题描述 每年冬天 北大未名湖上都是滑冰的好地方 北大体育组准备了许多冰鞋 可是人太多了 每天下午收工后 常常一双冰鞋都不剩 每天早上 租鞋窗口都会排起长龙 假设有还鞋的m个 有需要租鞋的n个 现在的问题是 这些人有多少种排法 可以避免出现
  • 前端配置跨域代理

    跨域时对于前后端开发中一个非常常见的问题 当我们客户端向我们的服务器请求接口数据的时候 我们可以请求到服务器当中的数据 但是我们把数据返回我们的客户端的时候就会产生跨域问题 所以 跨域是针对我们浏览器设置一个安全策略 就是当我们的协议 域名
  • Handler processing failed; nested exception is java.lang.NoClassDefFoundError

    在使用阿里云发送短信接口时出现此错误 原因是springmvcjar包和阿里云jar包出现冲突 建议使用下面两个版本
  • 【工具】VirtualBox虚拟机安装Windows操作系统

    前面的文章中介绍了VirtualBox虚拟机的安装 VirtualBox虚拟机中如何安装操作系统 是本文的重点 下面将进行详细介绍 使用VirtualBox虚拟机安装Windows操作系统有很多好处 主要包括以下几点 节省资源 通过虚拟化技
  • Spring Boot将声明日志步骤抽离出来做一个复用类

    上文Spring Boot日志基础使用 设置日志级别中我们写了个比较基本的日志操作 但也随之产生了一个问题 我们这行代码 能不能不写 具体说 我们不希望每个需要日志的类都声明一个在这 看着太不美观了 我们最简单方法当然是继承 我们找个目录创
  • 论python自动化测试(3)- 自动化框架及工具

    python自动化测试 3 自动化框架及工具 1 概述 手续的关于测试的方法论 都是建立在之前的文章里面提到的观点 功能测试不建议做自动化 接口测试性价比最高 接口测试可以做自动化 后面所谈到的 测试自动化 也将围绕着 接口自动化 来介绍
  • Linux Common Comment in Practices

    Linux中的命令的确是非常多 但是我们只需要掌握我们最常用的命令就可以了 当然你也可以在使用时去找一下man 他会帮你解决不少的问题 然而每个人玩Linux的目的都不同 所以他们常用的命令也就差异非常大 因为不想在使用是总是东查西找 所以
  • 网络安全等级保护合规一览

    公众号关注 WeiyiGeek 将我设为 特别关注 每天带你玩转网络安全运维 应用开发 物联网IOT学习 0x00 前言 0x01 等保2 0基本要求 0x02 等保定级 1 定级流程 2 定级比较 3 定级通用要求 0x03 合规流程 0
  • 自动化平台搭建之定制log系统

    log系统概述 我们搭建的自动化平台 无论是Web和Android 都少不了一个重要的模块 那就是log输出模块 该模块记录了整个自动化平台运行期间的日志记录 完成自动化测试后 我们可以通过日志追踪和分析fail项 根据自动化平台log输出
  • Intellj IDEA基础设置

    基础配置 view toolbar 配置jdk configure project defaults project structure new jdk 路径 添加插件 configure plugins 配置jvm内存 configure
  • Bootstrap的CSS类积累学习

    要看哪个的介绍 搜索关键词就行了 001 container 这是Bootstrap中定义的一个CSS类 它用于创建一个具有固定宽度的容器 比如 container类将 div 元素包装成一个固定宽度的容器 详情见 https blog c
  • STL vector的N种构造方式

    1 使用默认无参的构造函数进行构造 vector