vector 的内存管理以及顺序容器的选择

1. vector  size 相关的接口:

与容器大小相关的函数有以下几个:

size()   //返回当前元素个数

max_size()    // 当前能存储元素的最多个数

capacity()     // 容器在重新获得更多存储空间时,可以存储的元素总个数

reserve()     //指定vector 预留多少个元素的存储空间 ,当reserve ()< capacity() 时没有动作

shrink_to_fit()   //C++11新增接口,释放掉当前多余的capacity, 调用后 size() = capacity()

empty()   // 判断当前vector 是否为空,等价于size() = 0;


2. vector 内存管理方式方式

2.1 vector容器为了获取快速的随机访问,元素必须在内存中连续存储。

2.2 为了避免每次增加或删除元素时都需要重新开辟存储空间, vector 实际分配的内存比当前需要的内存会多一些,即capacity()  一般会大于size()

2.3 vector 新增元素时, 若size 没有超出capacity, 则不需要重新分配空间 

2.4 当size 超过capacity 时,  capacity 一般会自动扩展为当前的2倍,或者也可以通过reserve() 来人工指定vector预留多少空间

2.5 默认空的vector capacity 为0,然后增加到1,然后增加的规律是2倍;  若有同感reserve() 制定初始大小,则在初始大小的基础上double

2.6 max_size() 反应了在特定机器上vector 对象理论上能存储元素个数的上限,maxsize: 1073741823



3. 当调用pop_back() 接口释放掉存储的元素时,std::vector 不会重新分配内存,减少capacity()

    网上有的说法是,增加是double ,减少时每次减1/4, std::vector 是不会减少的




以下示例程序比较清晰的揭示了这个过程:

typedef vector<int> vectors;



void printVectInfo(vectors& ivec)
{
   cout<<"size: "<<ivec.size()<<endl;
   cout<<"maxsize: "<<ivec.max_size()<<endl;
   cout<<"capacity: "<<ivec.capacity()<<endl;
   cout<<endl;
}



int main(int argc, char* argv[])
{
   vector<int> ivec;
   printVectInfo(ivec);



   for(vectors::size_type i= 0 ; i!= 50 ; ++i)
   {
       ivec.push_back(i);
       printVectInfo(ivec);
   }



   return 0;
}


程序执行结果:



size: 0
maxsize: 107

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值