vector的size和capacity有什么区别?怎么使capacity值为0?

81 篇文章 2 订阅
订阅专栏
1 篇文章 0 订阅
订阅专栏

要说清这个问题,先抛出另外一个问题:vector和普通的数组有什么区别?

你可能会说:大家都知道,vector是动态数组~~

没错!  但是怎么个动态法?怎么实现的?

好,先说一下普通数组,比如:int arr[10]或者int *arr = new int[10]; 其实是你到内存里占了10个int大小的地方(空间)

当然,你可以这样操作:int a = arr[100];   arr[100] = 10;  这样编译器并不会报错,最多会警告你----你有越界行为。

       也就是说,你一开始说好了,你只占10个大小的地方,后来你出尔反尔,又去访问或者操作第100个地方(为了说明问题,事实上是第101个),那么内存的“管理员”他没有不让你操作的权利,只是给你出示了“黄牌警告”,告诉你:你去操作吧,出了问题概不负责!!!
       这就是数组越界问题,越界会造成未知的问题(程序崩溃等等),即你写的程序不受你控制了,或者不是你想要的结果(比如:你越界访问的地方是别人的地方,如果别人也没做“防护”,那么你修改了那个地方的值,就会让别人的会出现未知错误)。为了避免这个问题,那就老老实实的在那个10个大小的地方活动。

但是,在实际应用中,程序员的确有这样的需求:我开始是分配了10个大小的地方,但是我想给它后面添加一个或者给中间某个位置插入一个,变成连续11个数值。

      我再描述一下这个需求:在一个连续的数组添加元素,还能保证新的数组仍然在内存连续,也就是说用下标可以访问(arr[10]访问第11个元素)。

 vector就实现了这样的功能,当然vector功能不止这一个,还有很多操作(push_back,insert等)。

那么,vector是怎么实现这样的功能的?可以参考《STL源码剖析》

我们以push_back()为例,

 

其中size就是实际存入数据空间的大小,capacity是容量,即能容纳的数据个数。下面看一下push_back()的过程:

在insert_aux里:

这个过程就是容量扩充(备用空间不够了,就重新开辟更大的空间,把旧的拷贝进去,再把旧的释放了,有了更大的新空间,就可以连续的插入和追加元素了

所以这个过程:重新配置->拷贝数据->释放旧的空间

如果每添加一个元素都这样操作,那效率太低了,索性一次多分分配些空间。

但是注意:

1.vector可以用下标访问元素,但是,只能访问size以内的(比如,size=10,capacity=15,就不能arr[12]这样会报错)

2.一旦扩容,原来空间就已经不存在了,数组首地址也不存在了,因为旧的被复制到新的空间,旧的就被释放了。

下面回归正题:size和capacity有什么区别?

size是真实元素的所占的空间打开,capacity是整个可容纳的空间大小;

如第一个图:

size = finish - start

capacity = end_of_storage - start

下面看一下不同编译器capacity大小分配情况:

这是vs2017的运行结果:

        vector<int> arr(10,1);//10个空间,初值都是1
	cout << "size=" << arr.size() << endl;
	cout << "capacity=" << arr.capacity() << endl;

	arr.push_back(2);//向后面添加一个元素2
	cout << "size=" << arr.size() << endl;
	cout << "capacity=" << arr.capacity() << endl;

这是ubantu16,g++ 5.4的运行结果:

为什么capacity一样呢?

这个编译器有关系,在《STL源码剖析》上可以找到答案:

但是再vs2017上,capacity在满的时候,扩充的大小为原来的一半,而不是2倍。

===============================分隔线 2019.7.4=====================================================

【问题】怎么使capacity值为0?

先看代码,再讨论

#include "stdafx.h"
#include<vector>
#include<iostream>
void vector_test()
{
	std::vector<int> arr(10,1);
	std::cout << "arr(10,1):size=" << arr.size() << "; capacity=" << arr.capacity() << std::endl;
	arr.push_back(5);
	std::cout << "arr.push_back(11):size=" << arr.size() << "; capacity=" << arr.capacity() << std::endl;
	arr.clear();
	std::cout << "arr.clear():size=" << arr.size() << "; capacity=" << arr.capacity() << std::endl;
	//arr.resize(0);
	//std::cout << "arr.resize(0):size=" << arr.size() << "; capacity=" << arr.capacity() << std::endl;
	//arr.reserve(0);
	std::cout << "arr.reserve(0):size=" << arr.size() << "; capacity=" << arr.capacity() << std::endl;
	std::vector<int>(arr).swap(arr);
	
	std::cout << "vector<int>(arr).swap(arr):size=" << arr.size() << "; capacity=" << arr.capacity() << std::endl;
}
void Test()
{
	vector_test();
}
int main()
{
	Test();
	getchar();
    return 0;
}

 

 1.为什么要把capacity值变为0?

答:当vector容器不断的插入,capacity也不断的扩张,其实capacity是占着内存的,有时候用不了那么多,岂不是很浪费?所以怎么修改capacity的值,也就是我们手动的释放不使用的空间。capacity变为0只是经常会被问到,变为0都会了,变为其他值就是照猫画虎。

2.怎么变?

利用vector的拷贝构造函数。(1)vector的拷贝构造函数,只分配拷贝的元素需要的内存(2)因为产生临时对象,然后和原来对象进行交换。(3)临时对象消失。

收先验证拷贝构造函数,只分配拷贝的元素需要的内存:

std::vector<int> arr1 = std::vector<int>(arr);
std::cout << "arr1:size=" << arr1.size() << "; capacity=" << arr1.capacity()<<std::endl;

 

然后交换:

交换前需要使用clear,将容器清零。

arr.clear();
std::vector<int> arr1 = std::vector<int>(arr);
arr1.swap(arr);

 也可一步到位:

std::vector<int>(arr).swap(arr);

另外记录一下resize和reserve这两个函数:

resize是调整size的大小,如果size调整到比原来小,capacity的值不会变化;如果size调整的比原来大,则遵循push_back的扩容原则。

reserve是调整预分配空间的大小,如果调整比原来擦capacity小,依然还是原来capacity的大小。

https://www.cnblogs.com/chailu/p/6179263.html

vector的容量(capacity)和大小(size)的区别
qq_43768296的博客
05-30 7249
1.概念 容器的capacity:当前分配的存储容量,其实也就是当前情况下能够存储的元素个数 容器的size:表示容器中所包含(已经存储)元素的个数; 我们可以通过该模板类提供的成员函数,capacity()来获得当前容器的容量,以及size()来获得当前容器的大小 2.capacitysize的关系 在不分配空间的前提下,vectoe.size()<=vector.capacity(),一旦元素个数超过了当点分配空间容许的元素个数,容器就会扩容。 3.验证 #include<iostr
关于vector大小(size)和容量(capacity)总结
weixin_30666401的博客
04-08 8512
操作大小的函数 在Vector容器中有以下几个关于大小的函数 方法 效果 size() 返回容器的大小 empty() 判断容器是否为空 max_size() 返回容器最大的可以存储的元素 capacity() 返回容器当前能够容纳的元素数量 例子一: 该例...
Vectorsizecapacity区别
天高地阔的专栏
04-22 1046
size是指容器当前拥有元素的个数,而capacity是指容器在必须分配新的存储空间之前可以存放的元素总数。 如vector ivect(10),ivect.capacity()=10,ivect.size()=0,当你向ivect中插入元素时,只要没有超过十个, 那么capacity就不变,而size为你插入的元素的个数。当你插入第十个时,capacity=size=10,当再插入一个,
C++STL详解之vector
最新发布
2301_79821509的博客
08-16 2554
在C++中,vector是标准库提供的一个非常有用的容器类。它是一个动态数组,可以根据需要动态调整大小。它提供了方便的方法来管理和访问动态数组的元素。
Vectorsizecapacity区别
Captain_MXD的博客
04-20 713
1.size指容器当前拥有的元素个数;     capacity则指容器在必须分配新存储空间之前可以存储的元素总数      2.容器调用resize()函数后,所有的空间都已经被初始了,而reserve()函数预分配出的空间没有被初始化 int main() { vector v; v.reserve(100); v.resize(10); f
vector中的 sizecapacity和 reserve和 resize
tianshangyikexing的专栏
09-06 686
vector中与size()和capacity() 相对应的有两个函数:resize(size_type)和reserve(size_type)。 Size指目前容器中实际有多少元素,对应的resize(size_type)会在容器尾添加或删除一些元素,来调整容器中实际的内容,使容器达到指定的大小。 Capacity指最少要多少元素才会使其容量重新分配,对应reserve(size_type
【C++】STL——vector的有关空间的函数介绍和使用、sizecapacity函数、resize和reserve函数
Crocodile1006的博客
07-17 2704
SLT、vector的使用、vector空间增长问题、size(获取数据个数)capacity (获取容量大小)empty (判断是否为空)resize (改变vectorsize)reserve (改变vectorcapacity
C++ vector中的resize,reserve,sizecapacity函数讲解
热门推荐
阿木寺的博客
07-18 5万+
前言 在介绍resize(),reserve(),size()和capacity()函数之前,先简单介绍一下c++中vector的概念。 vector:顺序容器(可变大小数组)。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢。 既然vector是个容器,那么一定相关特性,如添加元素、删除元素和查询容器大小等操作。本文重点介绍vector中的resize(),reserve(),si...
vector容器 reserve和resizesize()和capacity()区别详解
weixin_43277501的博客
10-22 911
1、resize一个vector,相当于给其创建了n个元素,可以直接访问。 2、reverse的话,相当于申请了n个元素的空间,不可以直接访问,当push_back的时候,就是把元素放到这些空间里。 同时牵扯到size()和capacity()的区别size()相当于已经拥有的元素大小,而capacity()是能够装下的元素大小,当前可能并没有那么多元素,对应reverse。 错误案例:以下语法...
c++,stl,线性容器vector,string的sizecapacity,push_back,reserve,resize函数的作用和相互影响
ganfanren00001的博客
12-15 1840
c++,stl,容器的sizecapacity,push_back,reserve函数的作用 以非常常见的容器vector为例: .size()函数的作用是: 返回当前容器中程序员给容器的数据个数。 特点: 紧跟着程序员操作带来的的数据量改变而改变。 例如程序员定义了一个vector,然后push_back了5个数字进去,此时这个容器的size()返回值就是5,且size是从0开始,每push_back一次,size值紧跟着加一的。 程序员再push_back进去4个数,这个容器的size()返回值就是5
vectorsizecapacity
03-16
vectorsize指的是当前vector中元素的个数,而capacity则是vector在不重新分配内存的情况下可以容纳的元素个数。当vector中元素个数超过capacity时,vector会重新分配内存,将capacity扩大。
vector容器中sizecapacity区别
new9232的博客
11-20 5000
理解这两个方法的区别之前,需要先搞清楚vector的原理。vector底层是一个动态数组,插入元素时会申请新的空间,但考虑到效率问题,并不是每插入一个元素,就申请一个空间,而是事先先申请好一段空间,开始插入元素,当空间不足时,再重新申请一块更大的空间。并将原来空间中的数组拷贝到新空间中,再继续插入元素。 而size就是vector中元素的个数,而capacity就是vector申请的内存空间的大小。 std::vector<int> v1; for (i...
sizecapacity区别
jyx1572676601的博客
02-05 2362
先放代码: 下面讨论sizecapacity区别size一定与动态数组aha声明时的大小(即1000)相等,它是我们显式预定的空间。 而capacity则是系统数组在内存中连续空间的总大小,也就是说,我们可能申请了100大小的内存,但系统开辟空间时,给我们开辟了200大小的连续内存,这多出来的100,可以理解为备用空间。我们自己使用时,只能使用size大小内的空间(除非在尾部先添加),而不能直接使用备用空间(如下标越界)。 一般而言,size=capacity ,此时没有备用空间。如果
vectorsize()和 capacity()的区别
X-Weidong’s Blog
08-19 1万+
size()指容器当前拥有的元素个数; capacity()指容器在必须分配存储空间之前可以存储的元素总数。 例如: /* vectorsize()和 capacity()的区别 -----刘浩  2011年1月4日 */ #include #include #pragma warning (disable:4786) #include using n
vector_size
weixin_43499703的博客
05-11 3072
// vector::size #include <iostream> #include <vector> using namespace std; //返回的大小 //返回向量中元素的个数。 //这是向量中实际持有的对象的数量,这并不一定等于它的存储容量。 int main () { vector<int> myints; cout <&l...
关于vectorsize()的使用问题
jfkidear的专栏
03-10 1万+
vector vec; for (int i = 0; i { vec[i] } 这里会有个隐藏问题,当vec的size为0时,因为size()函数的返回值是无符号整型,这时vec.size() - 1是一个正数,导致vec[i]的访问越界
C++中vectorcapacitysize区别
bob的博客
10-01 1137
vectorcapacity是指最少要多少元素才会使容器重新分配,reserve()可以设置capacity值。 size是指容器中有多少个元素,resize()可以修改容器大小。 乍一看,如果没有没有使用reserve()的话,vectorsizecapacity应该是相同的,但是不见得。 代码1 int m,n; n=obstacleGrid.capacity(); m=obstacl...
C++ vector.size()
renhaofan的博客
05-20 4万+
vectorsize函数返回vector大小,返回值类型为size_type,Member type size_type is an unsigned integral type,即无符号整数; vector A; A.size()-1因为size返回值是无符号类型所以 A.size()-1越界,是个很大的数 所以要用的时候 要么预先定义一个 int n = A.size() - 1; 或者i...
写文章

热门文章

  • 日常Linux命令--vi/vim复制一行,粘贴 90962
  • C盘突然满了,找了好几天。。。 26971
  • 当int类型超出了[-2147483648,2147483647]会发生什么? 22965
  • fastdfs+nginx集群搭建 22377
  • ubnatu18.04重启网卡 19783

分类专栏

  • vim 1篇
  • scala 1篇
  • spark 2篇
  • geos 1篇
  • flatbuffer 1篇
  • brpc
  • Windows 33篇
  • C/C++ 81篇
  • Go语言 3篇
  • Linux 46篇
  • socket 6篇
  • 算法 19篇
  • 信息安全 4篇
  • Java 5篇
  • C# 5篇
  • git 9篇
  • Python 10篇
  • 数据结构 10篇
  • Redis 3篇
  • STL 1篇
  • 设计模式 3篇
  • nginx 7篇
  • mysql 4篇
  • 面试 2篇
  • http 1篇
  • MongoDB 7篇
  • 后端架构 4篇
  • 工具 3篇
  • lua
  • 网络 6篇
  • 管理 1篇
  • 敏捷开发 1篇
  • 分布式 1篇
  • fastdfs 1篇
  • zeromq 2篇
  • 音视频 1篇
  • 性能
  • docker
  • TCP/IP 3篇
  • DNS 1篇
  • WebService
  • 架构 1篇
  • libevent 2篇
  • 闲聊
  • thrift 2篇
  • Mac 1篇

最新评论

  • Release正常,Debug不正常的奇怪现象

    努力~奋斗!!!: 老哥记录得真好,我也遇到这个问题了

  • protobuf(C++)的使用(windows)

    浪p迹: 3.7.1版本用cmake生成失败了,下面再说——没有下文了吗

  • 当int类型超出了[-2147483648,2147483647]会发生什么?

    2201_75323869: 用%u也是一样,直接给你搞个正整数

  • C++(Linux)操作MongoDB

    zjp8023: python build/calc_release_version.py > VERSION_CURRENT C驱动安装时缺少这步。 官方文档写得比较详细

  • vector的size和capacity有什么区别?怎么使capacity值为0?

    WE xiye: 非常好,直接给我解除疑惑了!

最新文章

  • shell提取一行中的字符串
  • 网络查询工具
  • Brew自动安装
2022年3篇
2021年8篇
2020年5篇
2019年141篇
2018年72篇
2017年1篇

目录

目录

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

天下网标王创客网站优化方法惠州网站seo优化设计武汉搜索引擎网站优化哪家便宜比如网站的ui优化你会吗商丘网站优化哪家服务好西安网站怎么设置优化榆次网站优化贵吗企业网站搜索引擎优化情况分析网站ui优化网站的优化崇贤甜柚网络江宁网站优化网站价格seo网站优化广州b2b网站优化邵阳网站优化哪家值得信赖夏邑专业网站优化推广多少钱花都企业网站优化提高站外优化的网站医疗网站优化排名东城网站优化服务优化网站流程图解利于seo优化的网站嘉兴网站优化真的有用吗天津网站优化公司网站快速优化排名网站嘉定区公司网站优化排名网站如何做百度搜索优化千岛湖优化网站价格肇庆网站性能优化小吃加盟网站优化策划资源网站怎么优化香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化