关于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)总结 的相关文章

随机推荐

  • 用脚本批量执行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 该