在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&)来填入对象。

CPP-STL:vector中的size和capacity的更多相关文章

  1. STL—vector空间的动态增长

    vector空间的动态增长     当添加元素时,如果vector空间大小不足,则会以原大小的两倍另外配置一块较大的新空间,然后将原空间内容拷贝过来,在新空间的内容末尾添加元素,并释放原空间.vect ...

  2. C++ STL vector容量(capacity)和大小(size)的区别

    很多初学者分不清楚 vector 容器的容量(capacity)和大小(size)之间的区别,甚至有人认为它们表达的是一个意思.本节将对 vector 容量和大小各自的含义做一个详细的介绍. vect ...

  3. C++ STL vector容器学习

    STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...

  4. [GeekBand] STL vector 查找拷贝操作效率分析

    本文参考文献::GeekBand课堂内容,授课老师:张文杰 :C++ Primer 11 中文版(第五版) :网络资料: 叶卡同学的部落格  http://www.leavesite.com/ htt ...

  5. [CPP] STL 简介

    STL 即标准模板库(Standard Template Library),是 C++ 标准库的一部分,里面包含了一些模板化的通用的数据结构和算法.STL 基于模版的实现,因此能够支持自定义的数据结构 ...

  6. STL—Vector简介

    有关C++ STL 中的vector向量的用法(代码示例) 一. 简介 Vector是一个称为向量的顺序容器(不明白顺序容器与关联容器的可以Google). 二. 特点 1. 动态(相当于一个动态数组 ...

  7. STL vector

    STL vector vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问 ...

  8. STL vector用法介绍

    STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...

  9. C++ STL vector 内存分配

    vector为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储. 当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间.拷贝元素.撤销 ...

随机推荐

  1. MS SQL JSON类型type

    在MS SQL Server 2016,已经支持JSON处理. 执行下面代码,将获取ms sql server对象类型以及其说明: IF OBJECT_ID('tempdb.dbo.#json_typ ...

  2. 关于define

    <?php define('local','localhost');//echo constant('local');exit(); define('username','root'); def ...

  3. zabbix 接口 | zabbix api 实践

    原文地址:https://www.jianshu.com/p/d5faa110e78e zabbix 接口地址:https://www.zabbix.com/documentation/3.2/man ...

  4. 理解SPI

    SPI 全称为 Service Provider Interface,是一种服务发现机制.SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类.这样可以在运行时, ...

  5. 使用echo命令向文件写入内容

    0.前言     本文总结如何使用echo命令向文件中写入内容,例如使用echo指令覆盖文件内容,使用echo指令向文件追加内容,使用echo指令往文件中追加制表符.     echo向文件中输出内容 ...

  6. iOS 隐藏百度地图SDK的百度LOGO

    第一个思路:找到LOGO对应的UIIMageView,并将其隐藏hidden // 隐藏百度地图Logo UIView *mView = _mapView.subviews.firstObject; ...

  7. Django配置文件解释

    """Django settings for first project. Generated by 'django-admin startproject' using ...

  8. JS 对象的操作方法

    第一种: 变量名.style.属性: 第二种: 变量名.style[参数]

  9. Codeforces Round #564 (Div. 2) B. Nauuo and Chess

    链接:https://codeforces.com/contest/1173/problem/B 题意: Nauuo is a girl who loves playing chess. One da ...

  10. css文本换行的问题

    今天敲代码的时候发现了一个一直都没太注意的小问题,当我在一个200px的div中写了一长串的‘f ‘时发现没有换行 但加上空格或标点符号后就能自动换行 原来浏览器把它当成了一串完整的单词,所以默认不换 ...