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种构造方式 的相关文章

  • 使用 pybind11 修改 std::array 的默认值

    我的目标是修改在中声明的数组C struct并赋予默认值 我读过了this https pybind11 readthedocs io en stable advanced cast stl html making opaque types
  • 如何在 C++ 中对四元结构进行有效排序?

    我有一个包含 x y z 和 w 成员的结构 如何高效排序 在 C 中首先按 x 然后按 y 按 z 最后按 w 如果你想实现字典排序 那么最简单的方法是使用std tie实现小于或大于比较运算符或函子 然后使用std sort http
  • C++/STL 字符串:如何使用通配符模仿正则表达式之类的函数?

    我想使用通配符比较 4 个字符串 例如 std string wildcards H RH H 0 5 in the last one I need to check if string is H0 and H5 只用STL能实现吗 谢谢
  • 向量中的可变结构

    我正在尝试创建一个向量来跟踪游戏中的敌人 该向量将保存一堆可变结构 我有一个世界结构 其中有敌人作为其成员 如下所示 pub struct World pub player Creature pub enemies Vec
  • 在类中创建向量然后在函数中使用类对象不起作用

    我有课Employees 我试图让用户插入和删除员工 但它不起作用 向量的大小应为 500 class Employees public int maxx 500 vector
  • 在 C++03 中将成员函数传递给 for_each(无 boost,无 c++11)

    下面的 解决方案 可以编译 但这不是我想要的 我想通过put成员函数for each并不是 this 使用升压是NOT一个选项 这可以在 C 03 中解决吗 include
  • 等效

    这是否保证始终为真 std numeric limits
  • 如何随机打乱地图中的值?

    我有一个 std map 其中键和值均为整数 现在我想随机打乱地图 因此键随机指向不同的值 我尝试了 random shuffle 但它无法编译 请注意 我并没有尝试洗牌键 这对于地图来说没有意义 我正在尝试随机化这些值 我可以将这些值推入
  • 按偶数和奇数索引对向量进行排序。由 小码哥发布于

    是否有一种单行 或简单的无循环 解决方案可以按偶数和奇数索引对向量进行排序 例子 long entries 0 1 2 10 11 indices 0 1 2 3 4 std vector
  • 如何计算某物是否位于某人的视野中

    我有一个对象 它在 2D 空间中具有位置和速度 两者都由向量表示 对象的视野每侧均为 135 度 它看起来与移动的方向相同 速度矢量 我有一些对象 其在 2D 空间中的位置由向量表示 在图中 蓝色背景上的对象是可见的 红色背景上的对象对主体
  • 添加一条适合 R 中绘图峰值的曲线?

    如果给定两个向量及其图 是否有一个函数可以添加一条适合峰值的曲线 例如 我有 x c 0 20 X 1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 y 1 19 4 17 9 8
  • Idris - 自定义相关数据类型上的映射函数失败

    我对 idris 和依赖类型相对较新 遇到了以下问题 我创建了一个类似于向量的自定义数据类型 infixr 1 data TupleVect Nat gt Nat gt Type gt Type where Empty TupleVect
  • STL迭代器相等性是如何建立的?

    我想知道STL迭代器的相等 是如何建立的 它是简单的指针比较 因此基于地址 还是更奇特的东西 如果我有来自两个不同列表对象的两个迭代器并比较它们 结果是否总是错误 如果我将有效值与超出范围的值进行比较怎么办 这总是假的吗 如果需要 迭代器类
  • 此 C++ 模板中的迭代器类型应该是什么?

    前一段时间在处理一些图形代码时 我使用整数作为底层坐标持有者编写了 Rect 和 Region 类 并且效果很好 Region 被实现为 STL 列表的简单类扩展 并且仅包含 矩形列表 现在我还需要使用双精度作为底层坐标持有者的相同类型的类
  • 在使用 stop_token 等待条件变量_any 时是否需要拥有锁来请求停止?

    在等待条件变量时 更改谓词状态的线程必须拥有锁 因此在唤醒期间不会错过更新 根据文档 这是必要的 即使在使用原子变量时也是如此 不过我不确定是否request stop 已经正确处理了 那么问题是 这两个选项中哪一个是正确且符合标准的呢 j
  • 如何获取 std::vector 作为 int 的大小?

    I tried include
  • 矩阵循环移位

    有谁知道对矩阵进行右循环移位的有效方法 顺便说一句 矩阵是二元矩阵 但求解非二元矩阵的方法也很好 现在 我正在考虑为矩阵的行实现一个圆形数组 并在需要移位操作时更新每一行 我正在考虑的另一种方法是实现一个指向由向量表示的列 矩阵 的指针向量
  • std::deque 的内存开销到底是怎么回事?

    我正在研究一种使用外部排序算法std queue并且必须仔细限制其内存使用 我注意到在合并阶段 使用了几个std queues 固定长度 我的内存使用量增加到我预期的大约 2 5 倍 自从std queue默认情况下使用std deque作
  • LibGDX 将 Vector2 与浮点值相乘

    有没有办法将 Vector2 与浮点值相乘 我曾经在 XNA 中这样做 通过将归一化方向向量与速度浮点数相乘来计算运动 这几乎是我的代码中使事情正常工作的最后一步 但似乎没有用于接受浮点值的 Vector2 的乘法函数 我可以手动将 x 和
  • “包含字符串”的快速索引

    在我的应用程序中 我有多达数百万个短字符串 大部分短于 32 个字符 我想实现一个带有附加列表的搜索框 该列表仅包含包含在搜索框中输入的整个字符串的元素 如何预先建立索引来快速找到此类字符串 所有排序的 STL 容器都会检查整个字符串 对于

随机推荐

  • 使用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