关于vector大小(size)和容量(capacity)总结

2023-05-16

操作大小的函数

        在Vector容器中有以下几个关于大小的函数
方法效果
size()返回容器的大小
empty()判断容器是否为空
max_size()返回容器最大的可以存储的元素
capacity()返回容器当前能够容纳的元素数量

例子一:

      该例子主要展示了关于大小操作函数的使用与区别
int _tmain(int argc, _TCHAR* argv[])
{
	vector<string> sentence;
	sentence.reserve(5);
	
	//append some elements
	sentence.push_back("hello");
	sentence.push_back("how");
	sentence.push_back("are");
	sentence.push_back("you");
	sentence.push_back("?");
	copy(sentence.begin(), sentence.end(), ostream_iterator<string>(cout, " "));
	cout << endl;

	//print "technical data"
	cout << "max_size():" << sentence.max_size() << endl;
	cout << "size():" << sentence.size() << endl;
	cout << "capacity():" << sentence.capacity() << endl;
	
	cout << "**************************" << endl;
	
	//swap second and fourth element
	swap(sentence[1], sentence[3]);	
	//insert element "always" before element "?"
	sentence.insert(find(sentence.begin(), sentence.end(), "?"), "always");
	//assign "!" to the last element
	sentence.back() = "!";
	copy(sentence.begin(), sentence.end(), ostream_iterator<string>(cout, " "));
	cout << endl;

	//print "technical data"
	// return maximum possible length of sequence 
	//回容器的最大可以存储的元素个数,这是个极限,当容器扩展到这个最大值时就不能再自动增大
	cout << "max_size():" << sentence.max_size() << endl;
	// return length of sequence
	cout << "size():" << sentence.size() << endl;
	// return current length of allocated storage
	cout << "capacity():" << sentence.capacity() << endl;
	return 0;
}
        Vector的容量之所以重要,有以下两个原因:
          1. 容器的大小一旦超过capacity的大小,vector会重新配置内部的存储器,导致和vector元素相关的所有reference、pointers、iterator都会失效。
          2.内存的重新配置会很耗时间。
例子二:
该例子主要介绍了容器的重新配置导致iterator失效问题。
int _tmain(int argc, _TCHAR* argv[])
{
	vector<string> strVector;
	strVector.reserve(5);//当前空间够大,不会发生重新配置,插入新元素后有可能会重新分配

	strVector.push_back("hello");
	strVector.push_back("C++");
	strVector.push_back("world");

	vector<string>::iterator it = strVector.begin();
	cout << "chang size befor, the first elemt:" << *it << endl;

	cout << "push_back one elems:." << endl;
	strVector.push_back("MS");
	cout << "push_back one elemt after, the first elemt:" << *it << endl;

	cout << "push_back two elems:" << endl;
	strVector.push_back("HW");
    strVector.push_back("BAT");//当前大小超过当前的容量,导致重新分配内存
	//it = strVector.begin(); 内存重新分配后,重新获取指针可以避免指针失效
	cout << "push_back two elemts after, the first elemt:"<< *it << endl;//指针失效导致程序奔溃,

	return 0;
}

避免内存重新配置的方法

方法一:Reserve()保留适当容量

       在创建容器后,第一时间为容器分配足够大的空间,避免重新分配内存。
std::vector<int> v;//create an empty vector
v.reserve(80);// reserve memory for 80 elements

方法二:利用构造函数创建出足够空间

      该方法是创建容器时,利用构造函数初始化的出足够的空间,      
std::vector<int> v(80);

Vector内存扩展方式

          vector内存成长方式可归结以下三步曲:
(1)另觅更大空间;
(2)将原数据复制过去;
(3)释放原空间三部曲。
如果不是vector每次配置新空间时都有留下一些余裕,其成长假象所带来的代价将是相当高昂,从内存的扩展方式就可以看出向vector插入元素,可能导致迭代器失效的原理。
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于vector大小(size)和容量(capacity)总结 的相关文章

  • 我可以在 Javascript 中定义自定义运算符重载吗? [复制]

    这个问题在这里已经有答案了 是否可以在 JavaScript 中的类型实例之间定义自定义运算符 例如 假设我有一个自定义向量类 是否可以使用 vect1 vect2 检查是否相等 而底层代码会是这样的 operator a b return
  • 如何检查视频文件是否大于2MB?

    假设我从 iPhone 库中获取了一个视频文件 我想检查视频文件不应大于 2MB 我无法使用 videoMaximumDuration 方法 因为如果任何视频是高清质量的 即使是 1 分钟持续时间的视频也可能会很大 有什么意见吗 urlvi
  • jquery可调整大小附加图像大小问题

    我有下面的简单代码 当单击按钮时 它将图像附加到 container 问题是当我第一次单击按钮时 图像尺寸未正确附加 但是 当再次单击按钮时 我们会获得具有正确图像大小的附加图像 如果我们从等式中删除 resizing 这种情况就不会发生
  • 如何通过字符串名称访问结构体属性?

    我有一个结构 typedef struct Tick double open double high double low double close double ema100 Tick 我想访问给定密钥的属性 Tick currentTi
  • SVG/矢量图室内导航路由

    我一直在网上搜索有关如何为基于 SVG 的室内平面图实现我自己的点对点导航系统的教程或方法 我已经在网上搜索过 但唯一的选项适用于谷歌地图 不过 我使用 Illustrator 创建了地图 并使用路径 矢量作为 SVG 图像 我不需要为用户
  • 如何从矩阵的每一行中减去一个向量? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将矩阵的每一行除以固定行 https stackoverflow com questions 4723824 how can i divide each row of a matrix by a
  • gnuplot 动画 2D 矢量场

    我正在尝试使用 gnuplot 制作 2D 矢量动画 我想显示一行 即一次显示一个向量 我的数据结构如下 它们x y u v 2 24448 0 270645 1 00 1 00 3 24448 0 270645 0 500 1 20 我可
  • 无法在 Android 中将矢量可绘制对象转换为位图可绘制对象

    我正在尝试将位图转换为字节数组 其中我将矢量可绘制图像转换为位图 然后将其转换为字节数组 但是当我打开应用程序时 它向我显示错误类强制转换异常无法将矢量可绘制图像转换为位图可绘制 Resources res getResources Dra
  • 了解 Collection.isEmpty() 和 Collection.size() == 0 之间的区别? [复制]

    这个问题在这里已经有答案了 我读过很多关于两者之间差异的文章isEmpty and size gt 0 用于检查collection是否为空并发现isEmpty 表现超过size 但我无法轻易理解为什么性能isEmpty 即使 isEmpt
  • 我可以合法地写入常量向量指向的数据吗?把它分类?

    我有一个常量整数向量const vector
  • 如何设置按钮的大小?

    我将按钮放在带有 GridLayout 的 JPane 中 然后我用 BoxLayout Y AXIS 将 JPanel 放入另一个 JPanel 中 我希望 GridLayout 中的按钮是方形的 我使用 tmp setSize 30 3
  • 如何以编程方式移动 OpenLayers Vector?

    API 文档为OpenLayers Feature Vector http dev openlayers org apidocs files OpenLayers Feature Vector js html说 Vector 本身根本没有方
  • 将 R 中的向量按特定顺序转换为下三角矩阵

    我有一个向量 其中元素的顺序很重要 比如说 x lt c 1 2 3 4 我想将我的向量排列成具有特定顺序的下三角矩阵 其中每行包含向量的前一个元素 我的目标是获得以下矩阵 lower diag matrix 1 2 3 4 1 4 0 0
  • 从设备坐标系到绝对坐标系的加速度

    从我的 Android 设备中 我可以读取线性加速度值数组 在设备的坐标系中 和绝对方向值数组 在地球坐标系中 我需要的是获得后一个坐标中的线性加速度值 系统 我怎样才能转换它们 EDIT阿里在评论中回复后 好吧 如果我理解正确的话 当我测
  • 使用步骤 c++ 构建向量

    是否可以在不使用 C 中的循环的情况下以固定步骤创建从一个值到另一个值的向量 例如 我想用步长 0 5 构建一个从 1 到 10 的向量 在 MATLAB 中我可以按如下方式执行此操作 vector 1 0 5 10 c 中有类似的东西吗
  • 人体的宽度和高度

    如何识别图像中人体的高度和宽度 你需要一些参考点 除非您知道相机设置 位置 变焦 镜头畸变等 以及人相对于相机的位置 否则简单的照片是不够的 如果您确实有参考 例如背景中的网格或其他东西 那么您可以测量网格并从那里开始 听起来不像你需要的
  • 如何逐步绘制矢量路径? (拉斐尔.js)

    如何逐步动画化矢量路径 就像它被绘制一样 换句话说 慢慢地逐像素地显示路径 我在用着Rapha l js but如果您的答案不是特定于库的 例如可能有一些通用的编程模式可以完成此类事情 我对矢量动画相当陌生 欢迎 使用直线路径很容易做到 就
  • 如何在 switch 语句中将向量作为参数传递

    我对问题的谷歌搜索没有返回有用的结果和文档 switch没有告诉我如何做 所以我希望我能在这里得到答案 假设我有一个向量 cases lt c one two three 我想使用 switch 语句并将这些元素作为 switch 语句的参
  • 如果我不定义向量大小,程序会崩溃

    最近在学习C 偶然发现这个问题 std vector
  • 在 C++ 中将成对向量转换为两个独立向量的最快方法

    假设我有一个vector of pair

随机推荐

  • 用脚本批量执行redis命令

    最近在维护一个用redis做缓存的项目时 xff0c 遇到了产品需要不定时清除用户数据的需要 xff0c 由于每次要清除的用户数据很多 xff0c 每次手动删除的话比较繁琐 xff0c 最后采用了批处理脚本的方式来执行清除的命令 首先将要执
  • <STL>学习string

    string https www bilibili com video BV1P7411k7Km p 61 17 头文件 span class token macro property span class token directive
  • Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的对数Log变换算法增强(C#)

    Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的对数Log变换算法增强 xff08 C xff09 Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI S
  • Baumer工业相机堡盟工业相机使用BGAPI SDK将图像数据转换为Bitmap的几种方式(C#)(RGB)

    Baumer工业相机堡盟工业相机使用BGAPI SDK将图像数据转换为Bitmap的几种方式 xff08 C xff09 xff08 RGB xff09 Baumer工业相机Baumer工业相机图像数据转为Bitmap的技术背景Baumer
  • 【集合】统一身份认证(CAS)和OAuth2的工作流程

    一 CAS协议 单点登录SSO Single Sign ON xff0c 指在多个应用系统中 xff0c 只需登录一次 xff0c 即可在多个应用系统之间共享登录 如 xff1a 在学校登录了OA系统 xff0c 再打开科研 教务系统 xf
  • 英文突然间隔变大

    之前总是遇到一个尴尬的问题 xff0c 就是写文档的时候间距突然变大 xff0c 调整段落间距并未没有效果 xff0c 例如这种 xff1a 解决办法 xff1a Shift 43 空格
  • JAVA从入门到精通(2)

    一 Java中的关键字 1 关键字 xff1a 具有一些特殊用途的词 2 注 xff1a 在程序中应用关键词需要慎重 xff01 3 常用的关键词 xff08 举例说明 xff09 interface xff1a 接口 class 类 pu
  • myeclipse闪退的问题

    之前遇到myeclipse的闪退 xff0c 探索了之后 xff0c 找到了方法 xff0c 今天早上又遇到这种问题 xff0c 按照上次的方法尝试是没有问题的 决定和大家分享 删除 workspace xff08 工作空间 xff09 m
  • JAVA从入门到精通(14)-- 包装类

    一 包装类 1 基本数据类型是不具备对象的特征的 xff0c 比如基本数据类型不能调用方法 功能简单 xff0c 为了让基本数据类型具备对象的特性 xff0c Java为每个基本数据类型提供了一个包装类 2 3 包装类主要提供了两大类方法
  • JAVA从入门到精通(16)-- Java版JSON入门

    一 JSON课程介绍 1 JSON是行业内使用最为广泛的数据传输格式 定义 xff1a JSON是一种与开发语言无关的 轻量级的数据格式 全称是JavaScript Object Notation 优点 xff1a 易于人的阅读和编写 xf
  • JAVA从入门到精通(17)-- GSON

    一 GSON介绍 1 介绍 xff1a GSON最早由Google提出的开源的项目 xff0c 主页在github上 xff0c 解析json 二 GSON生成JSON数据 1 加入依赖 xff0c 创建包和类 2 创建Gson对象 Man
  • JAVA从入门到精通(18)-- Servlet

    一 Servlet定义 1 现有JSP还是先有Servlet xff1f 先有的Servlet xff0c 因为JSP的前身就是Servlet 2 定义 xff1a Servlet是在服务器上运行的小程序 一个Servlet就是一个Java
  • vue数据双向绑定

    5 Vue数据双向绑定 5 1 什么是双向数据绑定 Vue js 是一个 MVVM 框架 xff0c 即数据双向绑定 xff0c 即当数据发生变化的时候 xff0c 视图也就发生变化 xff0c 当视图发生变化的时候 xff0c 数据也会跟
  • Nmap入门到高级【第九章】

    预计更新 Nmap基础知识 1 1 Nmap简介和历史 1 2 Nmap安装和使用方法 1 3 Nmap扫描技术和扫描选项 Nmap扫描技术 2 1 端口扫描技术 2 2 操作系统检测技术 2 3 服务和应用程序检测技术 2 4 漏洞检测技
  • QEMU-IMG命令详解

    qemu img是QEMU的磁盘管理工具 xff0c 在qemu kvm源码编译后就会默认编译好qemu img这个二进制文件 qemu img也是QEMU KVM使用过程中一个比较重要的工具 xff0c 本节对其用法和实践使用方法进行介绍
  • 麒麟系统开机自启的实现方式

    方法 xff1a 利用Linux的 desktop文件实现开机启动 xff0c desktop文件位于在 etc xdg autostart目录下 举例 在 etc xdg autostart 目录下建立一个 test desktop文件
  • ifconfig与 ip addr命令详细

    文章目录 前言一 如何查看机器的IP地址二 网卡信息详解1 网卡名称2 网络设备状态标识3 IP地址4 MAC地址 三 ifconfig与 ip addr区别 前言 本文记录在linux系统下如何查看ip信息 网卡状态等信息以及简要说明if
  • Linux网卡ifcfg网卡配置项详解

    前言 由于在工作中涉及到服务器网卡的适配 xff0c 算是linux新手 xff0c 本次记录下linux网卡ifcfg exx配置项含义说明 xff0c 以下是某款终端下centos 7 5系统自动生成的网卡配置内容 xff1a span
  • Determining IP information for eth问题解决

    前言 在Linux网卡ifcfg网卡配置项详解文章中提到一个BOOTPROTO 61 配置项 它的意思是指网卡启动时获取ip的方式 xff0c 可以是dhcp或者静态ip 方式 xff0c 如果设置为none说明是不指定ip设置方式 一 问
  • 关于vector大小(size)和容量(capacity)总结

    操作大小的函数 在Vector容器中有以下几个关于大小的函数 方法效果size 返回容器的大小empty 判断容器是否为空max size 返回容器最大的可以存储的元素capacity 返回容器当前能够容纳的元素数量 例子一 xff1a 该