vector空间的动态增长

vector空间的动态增长
    当添加元素时,如果vector空间大小不足,则会以原大小的两倍另外配置一块较大的新空间,然后将原空间内容拷贝过来,在新空间的内容末尾添加元素,并释放原空间。vector的空间动态增加大小,并不是在原空间之后的相邻地址增加新空间,因为vector的空间是线性连续分配的,不能保证原空间之后有可供配置的空间。因此,对vector的任何操作,一旦引起空间的重新配置,指向原vector的所有迭代器就会失效。

vector的size(),capacity(),reserve(),resize()函数
    vector对象的内存布局如下图所示。

     start迭代器指向已用空间的首元素,finish指向已用空间的尾元素的下一个位置,end_of_storage指向可用空间的末尾。
      size()函数返回的是已用空间大小, capacity()返回的是总空间大小, capacity()-size()则是剩余的可用空间大小。当size()和capacity()相等,说明vector目前的空间已被用完,如果再添加新元素,则会引起vector空间的动态增长。
     由于动态增长会引起重新分配内存空间、拷贝原空间、释放原空间,这些过程会降低程序效率。因此,可以使用 reserve(n)预先分配一块较大的指定大小的内存空间,这样当指定大小的内存空间未使用完时,是不会重新分配内存空间的,这样便提升了效率。只有当n>capacity()时,调用reserve(n)才会改变vector容量。
     resize()成员函数只改变元素的数目,不改变vector的容量。

程序说明:
    分配了两个容器a,b。其中每次往a中添加1个元素,共添加10次。使用reserve()预先为b分配一块10个元素大小的空间,之后才每次往b中 添加1个元素,共添加10次。当b空间满后,再往其中添加1个元素。之后 使用reserve()为b分配一块15(比原空间小)个元素大小的空间。再使用resize()将b的元素个数改变为5个。
    观察上述过程中size()和capacity()大小的变化。
   
   
   
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. int main()
  5. {
  6. vector<int> a;
  7. cout << "a.size(): " << a.size() << " a.capacity(): " << a.capacity() << endl;
  8. for (int i = 0; i < 10; i++)
  9. {
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 C++ 中,`std::vector` 是一个动态数组,它可以根据需要动态增长和收缩。当向 `std::vector` 中添加元素时,如果当前容量不足以容纳新元素,`std::vector` 自动分配更多的内存空间来存储新元素。 `std::vector` 增长的原理如下: 1. 初始状态:`std::vector` 在创建时具有一个初始容量(通常为0),并且不占用任何内存。 2. 添加元素:当向 `std::vector` 中添加元素时,如果当前容量不足以容纳新元素,`std::vector` 分配一个更大的内存块,并将现有元素复制到新的内存块中。 3. 容量增长策略:`std::vector` 通常分配一个较大的内存块来容纳新元素,以减少频繁重新分配内存的次数。它可以使用两种常见的策略来决定新内存块的大小: - 增倍策略(倍增策略):每次需要增长时,将当前容量乘以一个固定的倍数(如2),以获得新的容量。 - 增加固定大小:每次需要增长时,将当前容量增加一个固定的大小(如一定数量的元素),以获得新的容量。 4. 容量调整:当 `std::vector` 中的元素被删除时,如果剩余元素的数量较少,`std::vector` 可能自动收缩其内存空间,以节省内存。然而,`std::vector` 不缩小到小于其初始容量的大小。 需要注意的是,`std::vector` 的动态增长可能导致内存重新分配和元素复制,这可能影响性能。如果事先知道 `std::vector` 的最大可能大小,可以使用 `reserve()` 函数预先分配足够的容量,以避免不必要的内存重新分配。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值