STL之Vector

vector模塑出一个动态数组,但是C++标准中并为要求以动态数组来实现vector。

屏幕快照 2017-04-22 上午10.11.32


  • vector是一种有序集合,可以随机访问,提供随机访问迭代器

  • 在末端添加或删除元素,vector的效率就非常好;但在前端删除或插入元素的效率就非常低

  • vector优异效率的秘诀就是分配出“较其容纳元素” 的更多内存


vector的容量为什么重要
屏幕快照 2017-04-22 上午10.20.56

  • vector的容量一旦超过capacity,就需要重新分配内存

  • vector不能使用reserve()缩减容量,即reserve()所给的容量小于vector的当前容量,则不会引发任何效果,这与string的reserve()有很大区别

  • C++11引入了一个新的vector函数:一个不具强制力的要求,可以缩减容量符合当前元素个数 \(shrink\_to\_fit\)


vector的构造函数
屏幕快照 2017-04-22 上午11.52.18


操作函数
屏幕快照 2017-04-22 下午2.36.39


赋值就是 将新元素赋值给vector,并将旧元素移除的方法

屏幕快照 2017-04-22 下午2.40.04


元素访问
屏幕快照 2017-04-22 下午2.42.54


插入和删除

插入和删除元素时必须保证传入的参数合法包括 1. 迭代器必须指向一个合法位置 2. 区间的起始位置不能在结束位置之后。

屏幕快照 2017-04-22 下午2.51.43

  • 调用pop_back时,确保容器不空是程序员的职责

  • 下列情况可以预期插入和删除动作快一些

    • 在容器尾部插入或者删除

    • 容量一开始就大

    • 插入多个元素时,调用一次比调用多次来得快

    • vector并未提供与某值相等的删除函数

    屏幕快照 2017-04-22 下午2.57.56

  • 注意 \(resize\) 和 \(reserve\) 的区别, \(resize\) 是更改 \(size\) 而 \(reserve\) 是更改 \(capacity\)

  • 移除与某值相等的第一个元素
    屏幕快照 2017-04-22 下午3.19.05

  • 将 \(vector\) 当作 \(C-style\) 数组使用
    屏幕快照 2017-04-22 下午3.24.10

  • 千万不要把迭代器当作"第一元素的地址"来传递
    屏幕快照 2017-04-22 下午3.24.18


class<vector>bool 是vector<>的特化版本,目的是为了获取一个优化的vector,目的是获取一个优化的vector,使其耗用空间远小于一般vector实现出来。一般实现版本会为每个bool元素分配至少1byte空间,而vector 版本内部只使用1bit存放一个元素,空间节省8倍。不过有个小麻烦:C++的最小可定址值是以byte为单位,所以上述的vector特化版必须对reference和iterator做特殊处理。

屏幕快照 2017-04-22 下午3.39.28

posted @ 2017-04-22 10:12  I呆呆  阅读(274)  评论(0编辑  收藏  举报