STL学习笔记----vector

作者:winterTTr(转载请注明) 资料来源:《The C++ Standard Library》

 

 

vector是STL中最简单,也是最常用的一个标准容器之一了。

其实,他就是对动态数组的封装,然后对于insert等操作进行的时候,在空间不够的情况下,会自动进行空间扩充及内容拷贝等等。

这里简单总结一下接口,然后说几点注意问题

 

 

  • size() vs capacity()
  • size函数返回的是当前数组中的实际存储的元素数量。

    capacity返回的是,当前数组中已申请空间的大小,所以说 size() <= capacity()

  • resize() vs reserve()
  • resize()重新分配数组的大小,让保证其不小于参数指定的数值。如果参数小于capacity(),会将多余数据清除掉(调用析构函数)。如果大于capacity()会重新分配空间并拷贝原始数据,同时,对于大于size()的部分,使用默认参数初始化。

    但是reserve并不进行元素的初始化,而只是进行空间的分配。当然,如果原始数据需要copy,是会调用拷贝构造函数的。

     

    PS: resize()是有默认参数的 ,类似于void resize( typename T t = T() )

    下面以一个例子分析一下resize(),究竟会发生什么:

    程序的结果如下:

    2293536|default constructor
    4074448|copy constructor from:2293536
    2293536|destructor
    push one item ==>
    size() 1
    capacity() 1

    2293536|default constructor
    4074576|copy constructor from:4074448
    4074577|copy constructor from:2293536
    4074448|destructor
    2293536|destructor
    push another item ==>
    size() 2
    capacity() 2

    2293312|default constructor
    4074577|destructor
    2293312|destructor
    resize 1 ==>
    size() 1
    capacity() 2

    2293312|default constructor
    4074448|copy constructor from:4074576
    4074449|copy constructor from:2293312
    4074450|copy constructor from:2293312
    4074576|destructor
    2293312|destructor
    resize 3 ==>
    size() 3
    capacity() 3

    4074448|destructor
    4074449|destructor
    4074450|destructor

     

    下面是一个分析的Sequence图:

    push one item

     

     

  • push another item

     

     

    好了,通过这几张图,我想你应该能比较详细的了解vector中空间的运作状况了。

  • 下面转一些具体的操作
  •  

  • 特别的使用
  • 我们可以把vector当作原始数组来使用,但是要注意一点的是,当做地址使用的时候,不要使用v.begin()的iterator,虽然对于某些实现来说,这样使用是没有问题的,但是,这样并不通用,我们应该正确的使用方法是&v[0]

     

     

    对于vector<bool>这种情况,STL的实现考虑到空间效率,并不是将一个真正的bool作为一个元素进行存储的,而是使用1bit来将空间缩小8倍,所以说,对于vector<bool>的使用,需要注意到这一点,当然,对于它也有一些自己特别的函数

     

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

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

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

      抵扣说明:

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

      余额充值