文档章节

vector 中 size()和 capacity()的区别

清风伴月
 清风伴月
发布于 2017/04/10 19:39
字数 592
阅读 9
收藏 0

在vector中与size()和capacity() 相对应的有两个函数:resize(size_type)和reserve(size_type)。

Size指目前容器中实际有多少元素,对应的resize(size_type)会在容器尾添加或删除一些元素,来调整容器中实际的内容,使容器达到指定的大小。

Capacity指最少要多少元素才会使其容量重新分配,对应reserve(size_type new_size)会这置这个capacity值,使它不小于所指定的new_size。

所以用reserve(size_type)只是扩大capacity值,这些内存空间可能还是“野”的,如果此时使用“[ ]”来访问,则可能会越界。而resize(size_type new_size)会真正使容器具有new_size个对象。

在对vector进行访问时,如果使用“[ ]”,则会像变通数组那样,不进行越界的判断。如果使用“at(size_type)”函数则会先进行越界的判断,例如下面两断程序:

程序一:

vector<int> v;

       v.reserve(2);

       v[0]=1;

       cout << v[0] << endl;

程序二:

vector<int> v;

       v.reserve(2);

       v.at(0)=1;

       cout << v.at(0) << endl;

两段程序编译都正常,执行时程序一会输出1。这是一个很危险的动作,因为v[0]这块内存还是“野”的。而程序二则会收到一条“std::out_of_range”异常,因为“at(size_type)”函数会进行进行下标越界的检查,来保证程序的安全。此时vector的size()为0,其中并没有对象,所以对第0个对象的访问是越界的。

结合下面的程序可以更入的理解程序一中的问题。

程序三:

       vector<int> v;

       v.reserve(2);  

       v[0]=1;

       cout << v[0] << endl;

       v.reserve(3);

       cout << v[0] << endl;

输出结果是

1

-842151451

原因很简单,虽然reserve(2)使vector容量扩展成至少为2,但是这些空间都是空的,也就是v[0]还是一块“野”内存。所以在使用reserve(3)扩展capacity时,得到的新空间里什么都没有。

 

总结:

1. operator[]和at()只能支改动那些确实存在于容器中的元素,不能自动使容器产生新元素。

2. at()提供了越界检查的功能,使用起来更安全,同时比起operator[]来代价也更大。

3. reserve()只能扩展容器的capacity,不会在其中加入元素。对于reserve()扩展的空间,可以使用push_back(const T&)来填入对象。

© 著作权归作者所有

清风伴月
粉丝 1
博文 129
码字总数 255659
作品 0
海淀
程序员
私信 提问
C++ reserve 与 resize的区别

resize要求容器具有sz个元素,可以使用c类型拷贝填充。否则用默认构造子填充;调用resize之后,容器的size()返回值发生改变; reserve要求容器可以容纳至少N个元素。它实际是要求容器分配内存...

老朱教授
2017/11/14
0
0
STL中vector的capacity、size、reserve、resize

size是指容器当前拥有元素的个数,而capacity是指容器在必须分配新的存储空间之前可以存放的元素总数。如vector ivect(10),ivect.capacity()=10,ivect.size()=0,当你向ivect中插入元素时,只...

Quincuntial
2015/12/31
0
0
重新认识java-Vector

源码解读 的声明: 通过继承和实现关系,可以看出继承自抽象类,实现了接口, , , . 功能和特点 Vector 继承了AbstractList,实现了List;所以,它是一个队列,支持相关的添加、删除、修改、遍...

hgfgoodcreate
2016/03/04
58
0
c++中vector的用法详解

转自:http://blog.csdn.net/hancunai0017/article/details/7032383 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大...

shenhuan1104
2017/11/24
0
0
【STL记录】Containers--Vectors

Vector类似于一个动态数组 使用vector,需加入头文件: 一、Abilities of Vectors Vector复制所有元素到它的内部动态数组中。通常这些元素是有一定顺序的,因此vector是一种有序集合。 Vect...

大道无名
2016/07/23
16
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
今天
9
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
今天
6
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
今天
8
0
Flutter 系列之Dart语言概述

Dart语言与其他语言究竟有什么不同呢?在已有的编程语言经验的基础上,我们该如何快速上手呢?本篇文章从编程语言中最重要的组成部分,也就是基础语法与类型变量出发,一起来学习Dart吧 一、...

過愙
今天
5
0
rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部