第九章:顺序容器

一、顺序容器概述:一个容器就是一些特定类型对象的集合

1、顺序容器类型:vector、deque、list、forward_list、array、string

  • string和vector将元素保存在连续的内存空间,所以用下标访问很快,但是在中间位置添加或删除元素很耗时
  • list和forward_list在任何位置添加和删除操作都很快,但是访问一个元素只能遍历它,而且额外的内存开销很大
    • forward_list设计的目的是与最好的手写的单向链表数据结构相当的性能
  • deque支持下标访问,且在两端添加或删除元素很快;但是同样在中间位置添加或删除元素很耗时

2、除非有很好的理由选择其他容器,否则应使用vector

3、如果不确定应该使用哪种容器,则只使用vector和list公共的操作:使用迭代器,不使用下标操作

4、每个容器都定义在一个文件名与类型名相同的头文件中

二、顺序容器都支持的操作

1、为了创建一个容器来为另一个容器的拷贝,两个容器的类型以及其元素类型都必须匹配;但是,当以迭代器为参数拷贝一个范围是,不需要容器类型相同,元素类型也只要能转换就可以

2、如果元素类型是内置类型或具有默认构造函数的类类型,则可以只为构造函数提供一个容器大小的参数。如果没有默认构造函数,则除了大小参数外,还需要指定显示的元素初始值

3、swap(c1, c2):交换两个相同类型容器的内容,它只是交换了两个容器的内部数据结构(名字),所以很快

  • 除了string,指向容器的迭代器,指针和引用在swap后不会失效。只是指向的内容变了
  • 对于string调用swap则会导致迭代器、引用和指针失效
  • 推荐使用函数版本的swap

4、assign:仅顺序容器使用:把元素替换成assign中参数的值

5、容器元素的插入是拷贝

6、push_front:list、forward_list和deque支持

7、insert:vector、deque、list和string都支持,但是vector、deque和string会很耗时

  • 接收元素和数或范围的insert,返回指向第一个新加入元素的迭代器
  • 返回的迭代器正好指向新元素
  • emplace在容器中直接根据参数调用构造函数构造元素,insert和push是拷贝元素到容器

8、c.back()、c.front()、c.at(n)、C[n]:访问元素,返回的都是引用

  • c[n]和c.at()区别是,后者在下标越界是会抛出out_of_range异常

9、erase:返回指向被删除元素之后元素的迭代器

10、forward_list支持的操作

  • lst.before_begin():返回链表首元素之前不存在的元素的迭代器
  • lst.insert_after(p, t):在迭代器p之后的位置插入元素
  • lst.erase_aftre(p):删除p指向的位置之后的元素

11、由于向迭代器添加或删除元素的代码会使迭代器失效,所以必须保证每次改变容器的操作之后要重新定位迭代器

三、容器适配器:stack、queue、priority_queue

1、默认情况下,stack和queue给予deque实现,priority_queue在vector上实现

 

猜测:deque只是保存了头结点的单链表,所以在中间插入值会很慢

posted @ 2015-09-27 19:45  dylqt  阅读(201)  评论(0编辑  收藏  举报