vector的size和capacity改变时空间分配的过程

本文通过实例解析了C++向量容器在插入元素时动态扩容的原理及过程,包括初始容量设置、扩容机制、容量计算公式,以及如何在操作前后观察向量大小与容量的变化。

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

当增加新元素(s)时,如果超过当时的容量,则容量会扩充至两倍。如果两倍容量仍不足,就扩张至足够大的容量。

以一个例子来说明:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
    int i;
    vector<int> iv(2,9);
    cout<<"size = "<<iv.size()<<endl;
    cout<<"capacity = "<<iv.capacity()<<endl;

    iv.push_back(1);
    cout<<"size = "<<iv.size()<<endl;
    cout<<"capacity = "<<iv.capacity()<<endl;

    iv.push_back(2);
    cout<<"size = "<<iv.size()<<endl;
    cout<<"capacity = "<<iv.capacity()<<endl;

    iv.push_back(3);
    cout<<"size = "<<iv.size()<<endl;
    cout<<"capacity = "<<iv.capacity()<<endl;

    iv.push_back(4);
    cout<<"size = "<<iv.size()<<endl;
    cout<<"capacity = "<<iv.capacity()<<endl;

    for(i = 0;i < iv.size();i++)
        cout<<iv[i]<<" ";
    cout<<endl;

    iv.push_back(5);
    cout<<"size = "<<iv.size()<<endl;
    cout<<"capacity = "<<iv.capacity()<<endl;
    for(i = 0;i < iv.size();i++)
        cout<<iv[i]<<" ";
    cout<<endl;

    iv.pop_back();
    iv.pop_back();
    cout<<"size = "<<iv.size()<<endl;
    cout<<"capacity = "<<iv.capacity()<<endl;

    iv.pop_back();
    cout<<"size = "<<iv.size()<<endl;
    cout<<"capacity = "<<iv.capacity()<<endl;

    vector<int>::iterator ivite = find(iv.begin(),iv.end(),1);
    if(ivite != iv.end())
        iv.erase(ivite);
    cout<<"size = "<<iv.size()<<endl;
    cout<<"capacity = "<<iv.capacity()<<endl;
    for(i = 0;i < iv.size();i++)
        cout<<iv[i]<<" ";
    cout<<endl;

    ivite = find(iv.begin(),iv.end(),2);
    if(ivite != iv.end())
        iv.insert(ivite,3,7);
    cout<<"size = "<<iv.size()<<endl;
    cout<<"capacity = "<<iv.capacity()<<endl;
    for(i = 0;i < iv.size();i++)
        cout<<iv[i]<<" ";
    cout<<endl;
    
    iv.clear();
    cout<<"size = "<<iv.size()<<endl;
    cout<<"capacity = "<<iv.capacity()<<endl;

    return 0;
}


### 向量大小在编程数据结构中的概念 #### 定义与特性 向量Vector),作为一种动态数组,在不同编程语言中有不同的实现方式。其主要特点是能够自动调整容量来存储任意数量的元素,而无需预先指定确切的数量。当涉及到向量大小时,通常指的是当前已分配给该容器用于保存元素的空总量以及实际存入的数据项数目。 对于C++标准模板库(STL)里的`std::vector<T>`而言,存在两个重要的成员函数用来描述这些属性: - `size()`返回的是目前所含有的有效元素个数; - `capacity()`则表示内部缓冲区可以容纳的最大元素数目而不必重新分配内存[^2]。 ```cpp #include <iostream> #include <vector> int main(){ std::vector<int> vec; // 输出初始状态下的尺寸信息 std::cout << "Initial size: " << vec.size() << "\n"; std::cout << "Initial capacity: " << vec.capacity() << "\n"; // 插入一些整数值到向量中 for(int i=0;i<10;++i){ vec.push_back(i); } // 再次打印更新后的尺寸详情 std::cout << "After adding elements:\nSize: " << vec.size(); std::cout << ", Capacity: " << vec.capacity(); return 0; } ``` 这段程序展示了如何创建一个空的整型向量,并通过循环往里面添加十个连续递增的自然数作为测试样本。随后分别调用了上述提到的方法获取并显示了两次操作前后的规模变化情况。 值得注意的是,尽管每次插入新项目都会使`size()`增加一位,但是除非达到现有预留空极限才会触发扩容机制进而改变`capacity()`的结果;否则即使不断追加更多条目也不会立刻影响后者取值。 此外,在某些情况下为了优化性能或者节省资源消耗,开发者可能会主动利用诸如`reserve(n)`这样的接口提前设定好预期最大承载能力从而避免频繁发生不必要的重定位过程;又或者是借助于`shrink_to_fit()`尝试释放多余未使用的储备区域以减少占用面积。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值