c++ vector 构造及常用方法 size与capacity()的区别及控制

#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

//c++ vector 构造及常用方法
int main()
{
    //  构造
    vector<int> v1 = {0,1,2,3,4,5,6,7};
    int a[10] = {0,1,2,3};      //默认填充 0
    vector<int> v2(10);         // == v2[10]; 默认填充 0
    vector<int> v3(10,1);       // == v2[10]; 填充1
    vector<int> v4(v1);
    vector<int> v5 = v1;
    vector<int> v6(v1.begin(), v1.end());      //都是左闭右开区间 【)
    vector<int> v7(a,a+3);                     //都是左闭右开区间 【)

    //  空间
    //  length(string专属)
    //  size capacity empty max_size resize reserve 同 string

    // 关于capcity()  与  size()   已分配空间大小(大)与实际占用空间大小(小)
    cout << v1.capacity() << endl;  //8
    v1.resize(100);	
    cout << v1.capacity() << endl;  //100       用0填充
    v1.shrink_to_fit();     //收缩空间到合适   令capcity的值 = size
    cout << v1.capacity() << endl;  //100

    vector<int>v11 = {0,1,2,3,4,5,6,7};
    cout << v11.capacity() << endl;  //8
    v11.reserve(100);
    cout << v11.capacity() << endl;  //100
    v11.shrink_to_fit();     //收缩空间到合适
    cout << v11.capacity() << endl;  //8


    //  取值
    cout << v1.front() << endl;
    cout << v1.back() << endl;
    cout << v1.at(3) << endl;

    //  增加
    v1.push_back(333);
    v1.pop_back();
    v1.assign(v2.begin()+3,v2.end()-2);     //赋值
    v1.clear();
    v1.swap(v2);

    // 插入
    v1 = {0,1,2,3,4,5,6,7};
    v2 = {8,8,8,8,8,8,8,8};

    v1.insert(v1.begin()+5, v2.begin()+2, v2.end()-2);      //插入都是在标记之前插入  和begin() end()对应 可以插入任何一个位置
    for(auto tmp = v1.cbegin(); tmp != v1.cend(); tmp++)    //遍历时尽量用 cbegin 避免改变 vector内的值
        cout << *tmp << ",";
    cout << endl;

    //vector  没有string 中的 find(), replace()

    //  关于  emplace_back 与 push_back
    //       emplace      与 assign    见另一篇

    return 0;
}

关于vector空间的分配
c++STL源码:

if (_Count == 0)//这里进行了判断,但是什么都不做,不知道为什么???????  
            ;  
        else if (max_size() - size() < _Count)//编译器可以申请的最大容量也装不下,抛出异常_THROW(length_error, "vector<T> too long");  
            _Xlen();    // result too long  
        else if (_Capacity < size() + _Count)//当前空间不足,需要扩容  
            {   // not enough room, reallocate  
            _Capacity = max_size() - _Capacity / 2 < _Capacity  
                ? 0 : _Capacity + _Capacity / 2;    // try to grow by 50%,扩容50%  
            if (_Capacity < size() + _Count)//扩容50%后依然不够容下,则使容量等于当前数据个数加上新增数据个数  
                _Capacity = size() + _Count;  
            pointer _Newvec = this->_Alval.allocate(_Capacity);//申请新的空间  
            pointer _Ptr = _Newvec;  
  
            _TRY_BEGIN  
            _Ptr = _Umove(_Myfirst, _VEC_ITER_BASE(_Where),  
                _Newvec);   // copy prefix  <span style="white-space:pre">  </span>//拷贝原有数据到新的内存中  
            _Ptr = _Ucopy(_First, _Last, _Ptr); // add new stuff<span style="white-space:pre">  </span>//拷贝新增数据到新的内存的后面  
            _Umove(_VEC_ITER_BASE(_Where), _Mylast, _Ptr);  // copy suffix  
            _CATCH_ALL  
            _Destroy(_Newvec, _Ptr);  
            this->_Alval.deallocate(_Newvec, _Capacity);//释放原来申请的内存  

不够时,每次扩容50%。
删除时,缓冲区大小并不会改变,仅仅只是清除了其中的数据。
只有在析构函数调用的时候vector才会自动释放缓冲区。

关于释放空间的方法:
方法1:shrink_to_fit();
方法2:vector(myvector).swap(myvector);
swap居然也可以,不相信的我试了一下

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v1 = {1,2,3,4,5};
    v1.reserve(100);
    cout << v1.size() << endl;
    cout << v1.capacity() << endl;
    vector<int>(v1).swap(v1);
    cout << v1.size() << endl;
    cout << v1.capacity() << endl;
    return 0;
}
5
100
5
5

居然真的可以。!!!!
然后查了一下为什么:
swap()过程:先创建一个临时拷贝与原先的vector一致,此时的拷贝其容量是尽可能小的符合所需数据的。紧接着将该拷贝与原先的vector v进行 交换。执行交换后,临时变量会被销毁,内存得到释放。此时的v即为原先 的临时拷贝,而交换后的临时拷贝则为容量非常大的vector(不过已经被销毁)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值