Vector的注意事项(大小与容量)

    标准模板库(STL)的所有容器中,Vector可以说是最容易上手、最容易理解的容器。不过,Vector也有好些值得我们注意的地方。

 

    众所周知,Vector是一个可以容纳动态长度的容器。为了高效地运用Vector,应该了解Vector大小(size)和容量(capacity)的关系:Vector之中用于操作大小的函数有size()、empty()等,另一个与大小有关的函数是capacity(),它返回Vector实际能够容纳的元素数量。如果超出这个数量,Vector就有必要重新配置内部存储器。

 

    Vector的容量之所以重要,主要有两个方面的原因:

    1. 一旦内存重新配置,和Vector元素相关的所有reference、pointers、iterators都会失效;

    2. 内存重新配置很耗时间。

 

    当然,你可以通过使用reserve()函数预留相当大的容量,以避免一再重新配置内存。只要保留的容量足够大,就不用担心references等会失效。

     std::vector<int> v;

     v.reserve(100);

     另一种避免重复配置内存的方法是:std::vector<T> v(5);不过这种方法,对基本型别效率和上一相似,如果元素型别是自定义的类型,此类型就必须提供一个default构造函数(自定义型别在初始化操作的时候很耗时, 不如reserve)。

 

    几点注意事项:

    1. Vector的容量不会缩减,即使使用clear()函数,清空Vector的所有元素,Vector的真正占用内存不会减少。不过有一个缩减Vector容量的小窍门:两个Vector交换内容后,两者的容量也会互换。现有Vector V;

    std::vector<int> tmp;

    V.swap(tmp);                       // 这样tmp就和V交换了容量

    或者:

    V.swap(std::vector<int>() );   // 和一个临时Vector交换

 

    2. 慎用Vector:Vector本身就占用一定的内存,即使不向其中添加任何元素。

    std::vector<int> tmp;

    int a = sizeof(tmp);               // 可以看到a的值为20(当然这个值根据不同的系统与环境有关,我的VS2008+win7)

    甚至,在许多实作方案中,容量的增长幅度比我们料想的还大。事实上为了防止内存破碎,在许多实作方案中即使不调用reserve(),当第一插入元素时也会一口气配置整块内存(如2K)。如果有一大堆Vectors,每个Vector的实作元素却寥寥无几,那么浪费的内存会相当可观。切记!!慎用Vector

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值