c++容器扩展---verctor的capacity()操作以及扩展

vector<int>c;
c.capacity()返回容器中数据个数,翻倍增长。

1.代码

#include <iostream>
  2 #include <vector>
  3 using namespace std;
  4 int main()
  5 {
  6     vector<int>v;
  7     v.push_back(1);
  8     cout<<"capacity == "<<v.capacity()<<endl;
  9 
 10     v.push_back(2);
 11     cout<<"capacity == "<<v.capacity()<<endl;
 12 
 13     v.push_back(3);
 14     cout<<"capacity == "<<v.capacity()<<endl;
 15     return 0;
 16 }

结果:

capacity == 1
capacity == 2
capacity == 4

2.压缩一个臃肿的vector

很多时候大量的删除数据,或者通过使用reserver(),结果vector的空间远远大于实际的需要。所以需要压缩vector到它的实际大小。resize()能增加vector的大小。clear()仅仅移除容器内的数据,不能改变capacity()的大小,所以对vector进行压缩非常重要。

(1)使用capacity()和clear()来操作一个vector

        vector<int>v;
        v.push_back(1);
        cout<<"capacity == "<<v.capacity()<<endl;

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

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

        v.clear();
        cout<<"clear()完之后: "<<v.size()<<endl;
        cout<<"clear()完之后的capacity == "<<v.capacity()<<endl;

结果:

capacity == 1
capacity == 2
capacity == 4
clear()完之后: 0
clear()完之后的capacity == 4

(2)通过上面的结果可以发下如下两个特点:①capacity()返回容器中数据个数,翻倍增长。②当清除完vector后capacity()仍然是4。

(3)下面定义一个新的vector,将原来的赋值给这个新的vector,看看会出现什么样的效果。

        vector<int>v;
        v.push_back(1);
        cout<<"capacity == "<<v.capacity()<<endl;

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

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

        vector<int>v1(v);
        cout<<"新的vector的capacity == "<<v1.capacity()<<endl;

结果:

capacity == 1
capacity == 2
capacity == 4
新的vector的capacity == 3

(3)通过上面的结果发现,新的数组的容量是元素的个数3。所以可以使用这种方法来达到压缩vector。接下来可以使用函数swap()进行优化。

        vector<int>v;
        v.push_back(1);
        cout<<"capacity == "<<v.capacity()<<endl;

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

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

        vector<int>v1(v);
        cout<<"新的vector的capacity == "<<v1.capacity()<<endl;

        v.swap(v1);
        cout<<"交换后原来vector的capacity == "<<v.capacity()<<endl;

结果:

capacity == 1
capacity == 2
capacity == 4
新的vector的capacity == 3
交换后原来vector的capacity == 3

(4)再次进行优化。采用匿名对象来代替v1这个中间对象:vector<int> (v).swap(v);

        vector<int>v;
        v.push_back(1);
        cout<<"capacity == "<<v.capacity()<<endl;

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

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


        vector<int> (v).swap(v);
        cout<<"交换后vector的capacity == "<<v.capacity()<<endl;

结果:

capacity == 1
capacity == 2
capacity == 4
交换后vector的capacity == 3

注:C++11中已经提供了shrink_to_fit()函数实现vector的压缩(你希望调用shrink_to_fit来将多余内存还给系统,但标准库不保证一定可以达到你的目的,类似于inline来实现函数内联)。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值