顺序容器:vector的自增长特性

本文详细介绍了C++标准库中vector容器的存储方式、size与capacity的区别、以及如何使用reserve操作来预分配存储空间,以减少不必要的内存分配开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、vector储存元素的方式:

vecto内的元素是连续储存的,当往vector中添加元素时,如果容器中已经没有空间容纳新的元素,由于元素必须连续存储以便索引访

问,所以不能在内存中随便找个地方存储这个新元素。于是,vector 必须重新分配存储空间,用来存放原来的元素以及新添加的元素:

存放在旧存储空间中的元素被复制到新存储空间里,接着插入新元素,最后撤销旧的存储空间。


对于不连续存储元素的容器,不存在这样的内存分配问题。例如,在 list 容器中添加一个元素,标准库只需创建一个新元素,然后将

该新元素连接在已存在的链表中,不需要重新分配存储空间,也不必复制任何已存在的元素。


对于大部分应用,使用 vector 容器是最好的。原因在于,标准库的实现者使用这样内存分配策略:以最小的代价连续存储元素。由此

而带来的访问元素的便利弥补了其存储代价。vector 容器预留了这些额外的存储区,用于存放新添加的元素。于是,不必为每个新元

素重新分配容器。

二、vector的size与capacity的区别,以及reserve操作:

[cpp]  view plain copy
  1. void test_vector_capacity_1()  
  2. {  
  3.     std::vector<int> vec;  
  4.     std::cout << "size:" << vec.size() << std::endl;          //size:0  
  5.     std::cout << "capacity:" << vec.capacity() << std::endl;  //capacity:0  
  6.     // 空vector的size和capacity大小都默认为0  
  7.   
  8.     vec.push_back(100);  
  9.     std::cout << "size:" << vec.size() << std::endl;          //size:1  
  10.     std::cout << "capacity:" << vec.capacity() << std::endl;  //capacity:1  
  11.   
  12.     vec.push_back(101);  
  13.     std::cout << "size:" << vec.size() << std::endl;          //size:2  
  14.     std::cout << "capacity:" << vec.capacity() << std::endl;  //capacity:2  
  15. }  
  16.   
  17. void test_vector_capacity_2()  
  18. {  
  19.     std::vector<int> vec;  
  20.     forint i = 0; i != 24; ++i )  
  21.     {  
  22.         vec.push_back(i);  
  23.     }  
  24.     std::cout << "size:" << vec.size() << std::endl;          //size:24  
  25.     std::cout << "capacity:" << vec.capacity() << std::endl;  //capacity:28  
  26.     // 预留50个元素的存储空间,即capacity至少为50  
  27.     vec.reserve(50);  
  28.     std::cout << "size:" << vec.size() << std::endl;          //size:24  
  29.     std::cout << "capacity:" << vec.capacity() << std::endl;  //capacity:50  
  30.   
  31.     // 将预留的容量用完:  
  32.     while( vec.size() != vec.capacity() )  
  33.     {  
  34.         vec.push_back(10);  
  35.     }  
  36.     std::cout << "size:" << vec.size() << std::endl;          //size:50  
  37.     std::cout << "capacity:" << vec.capacity() << std::endl;  //capacity:50  
  38.     /* 
  39.     使用reserve预留了50容量,因此 vector在每次添加元素时不必做任何的内存分配工作。事实上,只要有剩余的容量,vector 
  40.     就不必为其元素重新分配存储空间。当把预留容量使用完后,如果要添加新的元素,vector 必须为自己重新分配存储空间 
  41.     */  
  42.     vec.push_back(11);  
  43.     std::cout << "size:" << vec.size() << std::endl;          //size:51  
  44.     std::cout << "capacity:" << vec.capacity() << std::endl;  //capacity:75,重新分配储存空间  
  45.   
  46.     vec.reserve(70);  
  47.     std::cout << "size:" << vec.size() << std::endl;          //size:51  
  48.     std::cout << "capacity:" << vec.capacity() << std::endl;  //capacity:75  
  49.     /* 
  50.     调节容量为70但小于上一次分配的容量75,此时容量并不会改变,容器的元素个数也不会改变 
  51.     */  
  52.     vec.reserve(40);  
  53.     std::cout << "size:" << vec.size() << std::endl;          //size:51  
  54.     std::cout << "capacity:" << vec.capacity() << std::endl;  //capacity:75  
  55.   
  56.     // 需要调节的容量为100,大于75,则此时的容量为100  
  57.     vec.reserve(100);  
  58.     std::cout << "size:" << vec.size() << std::endl;          //size:51  
  59.     std::cout << "capacity:" << vec.capacity() << std::endl;  //capacity:100  
  60.   
  61. }  

三、vector容器的储存空间分配策略:

创建空的vector对象时容量为0,当现有容量用完后,重新分配空间时容量的增幅为原容量的1/2(整除2的结果),如果增幅小于1,则

取1,reserve操作将容量设定为指定大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值