STL-Vector内存机制

来源:互联网 发布:玉环网络安全教育平台 编辑:程序博客网 时间:2024/05/21 12:51

vector可以看作是一个动态数组,其内存是连续的,并具有以下特性:

(1) vector中的size表示当前实际数据数量,capacity 则表示当前可容纳的数量,即已开辟的内存。

(2) 释放(pop_back)、删除(erase) 和 清空(clear) 只会改变size,不会改变capacity 。只有在vector析构的时候才会清空所有内存。

(3) 当追加(push_back)、 插入(insert)等操作导致vector需要扩容时,采用下面准则。(vs2013下Vector源码)

    size_type _Grow_to(size_type _Count) const        {   // grow by 50% or at least to _Count        size_type _Capacity = capacity();        _Capacity = max_size() - _Capacity / 2 < _Capacity            ? 0 : _Capacity + _Capacity / 2;    // try to grow by 50%        if (_Capacity < _Count)            _Capacity = _Count;        return (_Capacity);        }

解释一下:设当前容量为a,需要额外增加的容量为b,则扩容后的容量为max(1.5a, a+b).

(4) 扩容时的操作流程为:开辟新内存 -> copy数据 -> 释放旧内存。因此频繁的导致vector扩容(如for循环持续push_back)会使得程序效率降低。因此,如有需要,可以提前通过初始化或者resize、reserve来预先开辟较大的容量。

(5) 如果想要提前释放掉vector开辟的内存,可以使其与一个空vector进行交换,如下:

// 创建一个vectorvector<int> data;for(int i = 0; i < 10; ++i)    data.push_back(i);// 与空vector进行交换 vector<int>().swap(data); // 或者data.swap(vector<int>());
原创粉丝点击