您的位置:首页 > 编程语言 > C语言/C++

【C++ Primer 学习笔记】chapter9 顺序容器

2012-09-07 20:38 330 查看
顺序容器类型

1. 顺序容器

vector 支持快速随机访问

list 支持快速插入/删除

deque 双端队列

2. 顺序容器适配器

stack 后进先出(LIFO)栈

queue 先进后出(FIFO)队列

priority 有优先级管理的队列

笔记:

9.1 顺序容器的定义

1). 复制容器对象的构造函数和使用两个迭代器的构造函数之间的差别

答:差别在于:复制容器对象的构造函数只能将一个容器初始化为另一容器的副本(复制所有元素),而且要求两个容器是同类型的;使用迭代器的构造函数可以将一个容器初始化为另一容器的子序列,不要求两个容器是同类型的。

2). 接受容器大小做形参的构造函数只适用于顺序容器,关联容器不支持。

3). 容器元素类型必须满足以下两个约束:元素类型必须支持赋值运算而且元素类型对象必须可以复制。引用类型不支持一般意义的赋值,IO库类型不支持复制或赋值,因此,没有元素是引用和IO库类型对象的容器。

4). 指定容器元素为容器类型时,必须使用空格隔开两个相邻的< <或者> >符号,以示这是两个分开的符号,否则系统会认为是<< >>为左移右移操作符,编译错误。e.g. vector< vector<int> > lines;

9.2 迭代器和迭代器范围

1) 关系操作符(< <= > >=)只适用于vector和deque容器,因为只有这两种容器为其元素提供快速、随机的访问。

9.3顺序迭代器的操作

1) 添加元素可能会使迭代器失效,避免存储end操作返回的迭代器,每次做完插入操作运算后重新计算end迭代器值,直接使用ivec.end();

2) C++语言只允许两个容器做其元素类型定义的关系运算

3) 使用只带有一个长度参数的resize操作对元素类型的要求:此操作对新添加的元素进行值初始化,如果是类类型,则必须提供显式的构造函数,或者不提供任何构造函数,以便使用编译器自动生成的默认构造函数。

4) 容器类型的front和back成员返回容器内第一个获最后一个元素的引用。 ilst.front() 相当于 *ilst.begin();

5) vector和deque容器还可以使用c
,c.at(n)访问对象c下标为n的元素。

6) 寻找一个指定元素的最简单方法是使用标准库的find算法;

7) erase、pop_front和pop_back函数通常使指向被删除元素的所有迭代器失效。对于vector容器,指向删除点后面的元素的迭代器通常也会失效。而对于deque容器,如果删除时不包含第一个元素和最后一个元素,那么读deque容器相关的所有迭代器都会失效;

8) 赋值和assign操作使左操作数容器的所有迭代器失效。swap操作不会使迭代器失效。完成swap操作后,尽管被交换的元素已经存放在另一容器中,但迭代器仍然指向相同的元素;

9) 要交换的容器的类型必须匹配:操作数必须是相同类型的容器,而且所储存的元素类型也必须相同;使用swap操作以节省删除元素的成本。

9.4 vector容器的自增长

1) 对于大部分应用,使用vector容器时最好的,原因在于,标准库的实现者使用这样的内存分配策略:以最小的代价连续存储元素,由此而带来的访问元素的便利弥补了其存储代价;

2) 每当vector容器不得不分配新的存储空间时,以加倍当前容量的分配策略实现重新分配;

3) vector提供了的capacity操作获取在容器需要分配更多的存储空间之前能够存储的元素总数,reserve操作告诉vector容器应该预留多少个元素的存储空间。size指容器当前拥有的元素个数。

9.5 容器的选用

1) 通常来说,除非找到选择使用其他容器更好的理由,否则vector容器都是最佳选择;

2) 选择容器类型的一些法则:

1> 如果程序要求随机访问元素,则应使用vector或deque

2> 如果程序必须在容器的中间位置插入或删除元素,则应采用list容器

3> 如果程序不是在氢气的中间位置,而是在容器的首部和尾部插入和删除元素,则应采用deque容器

4> 如果只需在读取的时在容器的中间位置插入删除元素,然后需要随机访问元素,则可以考虑输入时将元素读入到list容器,接着对此容器重新排序,使其适合顺序访问,然后将排序后的list容器复制到一个vector容器。

9.6 再谈string类型

1) string类型不支持以栈方式操纵容器;

2) 无论要求赋值多少个字符,标准库最多只能复制数目与string对象长度相等的字符;

3) 修改string对象的操作 p294

9.7 容器适配器

1) stack适配器可以建立在vector、list或者deque容器之上,queue适配器只能建立在list容器上,priority_queue适配器只能建立在vector或deque容器上;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: