加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

C/C++ 标准容器 vector的内存空间自动增长总结

发布时间:2021-11-12 15:51:36 所属栏目:教程 来源:互联网
导读:vector,string,deque的内存存储机制:在一个连续的内存空间存储,所以才支持下标操作。 vector的课题:由于容器的大小是可变的,当插入元素后,vector必须分配新的内存来保存已有元素和新的元素,将已有元素从旧的内存地址移动到新的内存地址,并释放掉旧的内
vector,string,deque的内存存储机制:在一个连续的内存空间存储,所以才支持下标操作。
 
vector的课题:由于容器的大小是可变的,当插入元素后,vector必须分配新的内存来保存已有元素和新的元素,将已有元素从旧的内存地址移动到新的内存地址,并释放掉旧的内存空间。如果我们每添加一个新元素,vector就执行一次这样的内存分配和释放操作,性能会慢到不可接受
 
解决方案:为了避免这种代价,标准库实现者采用了可以减少容器空间重新分配次数的策略。当不得不获取新的内存空间时,vector和string的实现通常会分配比新的要求空间更大的内存空间。容器预留这些空间备用,可用来保存更多的元素。这样,就不需要每次添加新元素都重新分配容器的内存空间了。
 
有了上述的背景,就有了下面的函数:
 
capacity 返回size + 预留空间的大小
reserve(n) 分配至少能容纳n个元素的空间
shrink_to_fit 将capacity()减少为为与size()相同大小
#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <forward_list>
#include <deque>
 
using namespace std;
 
int main(){
  //下面代码展示了size和capacity之间的相互作用                                 
  vector<int> ivec;
  //size为0;capacity的值依赖于库的具体实现                                   
  cout << " ivec:size: " << ivec.size()
      << " capaciy: " << ivec.capacity() << endl;
  //想ivec添加24个元素                                                         
  for(vector<int>::size_type i = 0; i != 24; ++i){
    ivec.push_back(i);
  }
  //size为24;capacity大于等于24                                               
  cout << " ivec:size: " << ivec.size()
      << " capaciy: " << ivec.capacity() << endl;
  //用reserve预分配一些额外的空间                                             
  ivec.reserve(50);
  //size还是24;capacity大于等于50                                             
  cout << " ivec:size: " << ivec.size()
      << " capaciy: " << ivec.capacity() << endl;
  //添加元素,用光多余容量                                                     
  while(ivec.size() != ivec.capacity()){
    ivec.push_back(0);
  }
  //size为50;capacity为50                                                     
  cout << " ivec:size: " << ivec.size()
      << " capaciy: " << ivec.capacity() << endl;
  //再添加一个元素,vector就不得不重新分配空间                                 
  ivec.push_back(51);
  //size为51;capacity的值依赖于库的具体实现                                   
  cout << " ivec:size: " << ivec.size()
      << " capaciy: " << ivec.capacity() << endl;
  //要求归还内存                                                               
  //shrink_to_fit只是一个请求,标准库并不保证退还内存                         
  ivec.shrink_to_fit();
  //size为51;capacity的值依赖于库的具体实现                                   
  cout << " ivec:size: " << ivec.size()
      << " capaciy: " << ivec.capacity() << endl;

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读