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

随机推荐

  • 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
  • pixhawk自学笔记之uorb学习总结

    注 xff1a 这是看过好多文章总结出来的 xff0c 转载了较多人的博客 xff0c 希望有知道原出处的人把地址留下 xff0c 我贴上来 在此谢谢各位前辈的总结 xff08 我会在后续笔记中贴出在我自己的程序中对于uorb的使用 xff
  • pixhawk自学笔记之px4程序启动顺序

    在了解px4启动之前我们需要了解一下bootloader Bootloader是在操作系统内核运行之前运行 xff0c 可以初始化硬件设备 xff0c 建立内存空间映射图等 xff0c 整个系统的加载启动任务就是完全由Bootloader来
  • PID概述以及在无人机中的应用

    PID控制是将误差信号的比例P xff0c 积分I xff0c 微分D通过线性组合构成控制量 xff0c 称之为PID控制 但是在很多情况下 xff0c 往往不一定需要三个单元 xff0c 但是比例单元是必不可少的 PID控制器难点在于参数
  • PID连续控制算法的表达式以及C语言实现

    1 数字 xff08 离散 xff09 PID控制算法的表达式 xff1a 将PID调节器离散化 xff0c 用差分方程来代替连续系统的微分方程 xff0c 分为位置式和增量式两类 重点理解概念如下 xff1a a xff09 基本偏差e
  • 简单常用滤波算法C语言实现

    1 限幅滤波算法 xff08 程序判断滤波算法 xff09 方法解析 xff1a 根据经验判断 xff0c 确定两次采样允许的最大偏差值 xff08 设定为A xff09 xff0c 每次检测到新值时判断 xff1a 如果本次值与上次值之差
  • Nuttx的源码构建和编译

    下载源码 sudo mkdir Nuttx cd Nuttx Nuttx xff1a git clone https bitbucket org nuttx nuttx gitapps xff1a git clone https bitbu
  • ZMQ简介

    ZMQ xff08 MQ ZeroMQ 0MQ xff09 看起来像是一套嵌入式的网络链接库 xff0c 是网络通信中新的一层 xff0c 介于应用层和传输层之间 xff08 按照TCP IP划分 xff09 xff0c 其是一个可伸缩层
  • ubunut安装stlink

    在ubuntu上面的stlink驱动的安装 依赖包的安装 sudo apt get install libusb 1 0sudo apt get install cmakesudo apt get install libgtk 3 dev
  • Nuttx程序测试

    前面两篇文章我们讲述了如何编译nuttx和ubuntu下stlink的安装 现在我们继续往下测试程序 硬件环境 stm32f407discovery软件环境 ubuntu14 04 43 vim 我们首先进入到nuttx tools目录下执
  • 两种四轴PID讲解

    参考资料 xff1a 爱无人机论坛 单级PID xff1a PID算法属于一种线性控制器 xff0c 这种控制器被广泛应用于四轴上 要控制四轴 xff0c 显而易见的是控制它的角度 xff0c 那么最简单 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设置方式 一 问
  • 回首2013,展望2014

    此刻值此2013年末 xff0c 明天便是元旦 近日浏览CSDN论坛时 xff0c 发现有许多的坛友都在写2013年度总结 xff0c 博客作为个人的名片 xff0c 也决定开始尝试写博客 xff0c 我的第一篇博客就是关于2013年度总结
  • 关于vector大小(size)和容量(capacity)总结

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