《C++ primer》第9章 顺序容器

 原先学习C++从来不知道有容器一说,就晓得一个面向对象,一叶障目,如今了解到标准库,它的强大正向我慢慢展示,前进吧

顺序容器的定义

  1. 标准库定义了三种容器类型:vector, list , deque  区别在于访问元素的方式,以及添加和删除元素的运行代价
  2. 顺序容器的适配器:适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础容器类型。
  3. 顺序适配器: stack 后进先出 queue:先进先出  priority_queue:有优先级管理的队列
  4. 容器类型使用默认构造函数能达到最佳运行时性能
  5. 使用迭代器的构造函数,可以将一个容器初始化为另一个容器的子序列,不要求两个容器是同类型的(模板编程可以看到这是一个成员模板,包含两个模板形参表)
  6. 容器内元素的类型满足约束:元素类型必须支持赋值运算,元素类型类型的对象必须可以复制(暂时无法理解,自己定义的类类型具有以上这两条性质吗)(意味着IO类型对象不能使用顺序容器)
  7. 引用类型不可以作为容器的元素类型,其它的内置和复合类型都可以。
  8. 除输入输出(IO)标准库类型,其它标准库类型都是有效的容器元素类型。iostream类型不支持复制和赋值
  9. 容器的容器  二维数组

迭代器和迭代器的范围

  1. 关系操作符只适用于vector和deque容器,这是因为只有这两种容器为其元素提供了快速、随机的访问
  2. list容器的迭代器既不支持算数运算,也不支持关系运算,它只支持自增自减以及(== !=)的运算
  3. 迭代器范围是标准库的基础
  4. [first,end) python中迭代器范围定义相同
  5. last绝对不能再first之前。编译器不会检查
  6. 使用迭代器编写程序时,必须留意哪些操作会使迭代器无效,否则会导致严重的运行错误
  7. 为何不能在编译器检查出迭代器的失效(编译器为何不做这样的操作)

顺序容器的操作
  1. 容器定义的类型别名包括 :size_type,iterator,const_iterator,value_type,reference等
  2. value_type,reference无需知道容器的真正类型,就能使用它。在编写泛型程序的时候,这些类型非常有用(以后体会)
  3. 所有顺序容器支持push_back操作,push_front只有list和deque支持
  4. vector容器使用insert时,在结尾处插入代价非常高
  5. insert和push操作可能导致迭代器失效。当编写循环将元素插入到vector或是deque容器中,程序必须保证每次循环后迭代器得到更新
  6. 所有的容器类型都支持比较操作,比较的容器必须具有相同的容器类型。
  7. resize操作可能使迭代器失效
  8. c.back() c.front()返回的是容器的引用,也可以用迭代器的解引用
  9. 删除操作:erase()返回的是迭代器,指向删除元素的后面的元素
  10. 寻找指定元素的方法是find方法,包含在algorithm头文件,find(begin,end,searchvalue)
  11. 赋值操作首先删除左操作数的所有元素,然后将右边的容器中的元素插入到左边的容器中:即使赋值前左右容器的长度不相等
  12. 赋值和assign操作会使左操作数容器的所有迭代器失效。swap不会使迭代器失效
  13. c1.swap(c2) c1,c2类型必须相同。该函数的执行速度比将c2元素复制到c1的操作快 swap保证常数时间替换
  14. assign操作可以运用于不同容器中,可将vector容器中一段char*元素赋值给string类型的list容器
  15. 没有移动元素意味着迭代器不会失效

vector容器的自增长

  1. 为了支持快速的随机访问,vector容器中的元素以连续的方式存放。标准库的实现者使用这样的内存分配策略:以最小的代价连续存储元素。由此带来的访问元素的便利弥补了其存储代价
  2. 实际为vector分配的容量比当前所需的空间多一些
  3. vector的两个成员函数:capacity,reserve,方便与内存进行交互。
  4. capacity,size,reserve :  size  <= capacity ,reserve是操作:预留多少操作空间
  5. 当耗尽了预留的容量时,如果添加新的元素,vector将重新为自己分配空间
  6. 因此从技术上说,原来为空的vector容器上n次调用push_back函数,其执行时间永远不超过n的常量倍

容器的选用

  1. 容器是否连续存储显著的影响:a)在容器中间位置添加和删除元素的代价 b)执行容器元素的随机访问的代价
  2. deque容器拥有复杂的数据结构,从deque队列两端插入和删除元素都非常快,中间的话代价更高
  3. 通常情况下,使用vector容器
  4. 编写代码时如果无法确定使用那种容器,那么用迭代器操作,而不是下标,并且避免随机访问元素,这样,在必要时,可以方便的才vector容器修改为list容器

再谈string类型

  1. string类型与vector容器不同的是:不支持以栈的方式操纵容器:不允许使用front ,back等操作

容器适配器

  1. 本质上,适配器是使一事物的行为类似于另一事物的行为的一种机制。例如stack可以使任何一种顺序适配器以栈的方式工作
  2. 默认的stack和queue都是基于deque容器实现,priority_queue则在vector容器上实现
  3. stack可以建立在vector、list、deque上,queue只能建立在list上,priority_queue要求能提供随机访问,只能建立在vector和deque上。
  4. 适配器建立在容器上,通过调用容器的操作来完成属于自己的操作,例如栈就必须可以push,调用的其实是deque中的push_back
  5. priority_queue为用户队列中存储的元素设置优先级。这种队列不是将新元素放置在队列尾部,而是放置在比它优先级低的元素前。(以后体会)







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值