C++ std::vector: vector中元素的存储方式 size、capacity、reserve、resize的使用

1. vector的对象的存储方式

为了支持随机访问,vector将元素连续存储–每个元素紧挨着前一个元素存储。容器中元素是连续存储的,且容器的大小是可变的。

在容器中增加元素时。vector根据存储元素的大小,在内存上申请一个空间,用于存储数据,空间的大小通常会大于所存储元素的实际大小,并且预留出一部分预留的空间,以便再次增加数据时,可以不用重新开辟空间。

当容器再次增加新的元素后,首先判断预留的空间是否够用,如果够用直接在预留空间中存储。如果预留的空间不够,需要在内存中开辟一整块新的更大的空间,并将vector原来的存储的数据拷贝过来,存储到新的内存中,然后在新的内存中增加需要增加的元素,这样保证存储的空间是连续的。所开的空间会预留出一部分空间,以便后续增加数据。

理解了vector的对象的存储方式,很轻松理解size、capacity、reserve、resize的使用。

2. size()和capacity()

size(): 返回vector中存放元素的实际数量( 实际存储元素的个数)。返回值为size_type(无符号整数类型)

capacity(): 返回vector在内存中,开辟空间的容量(最多能放所少个元素)。返回值为size_type(无符号整数类型)

例子:

#include <iostream>
#include <vector>
int main()
{
    std::vector<int> vecInt;
    
    std::cout << vecInt.size() << std::endl;	// 输出的结果为0
    std::cout << vecInt.capacity() << std::endl;	// 输出的结果为0 

    for(int i = 0; i < 10 ; ++i)
    {
        vecInt.push_back(i);
    }

    std::cout << vecInt.size() << std::endl;	// 输出的结果为10,容器中存了10个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为16,容器在内存开辟空间的容量(包含预留空间)
}

3. reserve()和resize()

reserve(): 在内存上指定容器开辟空间的容量大小。

  • 如果容器目前在内存上开辟空间的容量大于指定的容量,则不做处理直接返回。
  • 如果容器目前在内存上开辟空间的容量小于指定的容量,则在内存上开辟指定容量大小的空间,并将原来的数据拷贝到新的内存中。(相当于容器扩容)

resize():设置容器中的元素。有两个参数,一个参数表示指定元素的数量。另一个可选参数表示,指定元素初始化的值。如果不传入第二个参数,则使用默认值初始化。

  • 如果容器中的元素数量大于resize中设置的值,则将后面多出的元素删除。
  • 如果容器中的元素数量小于resize中设置的值,则在原来的元素后面新增新的元素,如果没有指定值,则按照默认值初始化。

例子:

#include <iostream>
#include <vector>
int main()
{
    std::vector<int> vecInt;

    std::cout << vecInt.size() << std::endl;	// 输出的结果为0
    std::cout << vecInt.capacity() << std::endl;	// 输出的结果为0 

    vecInt.reserve(10);     // 在内存上开辟容量为10的空间
     
    std::cout << vecInt.size() << std::endl;	// 输出的结果为0
    std::cout << vecInt.capacity() << std::endl;	// 输出的结果为10

    vecInt.resize(20,1);    //  将容器初始化20个元素,每个元素的默认值为1

    std::cout << vecInt.size() << std::endl;	// 输出的结果为20,容器中存了20个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为20,容器在内存开辟空间的容量
}

注意: 在执行resize时,如果容器中在内存中,所开的空间不够,会自动扩容。不一定非要执行reserve(),提前开辟空间。在容器中使用其他函数添加元素也是如此。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值