10、C++ Primer 4th 笔记,顺序容器(2)
时间:2011-03-19 来源:edwardlewiswe
1、size 指容器当前拥有的元素个数;而 capacity 则指容器在必须分配新存储空间之前可以存储的元素总数。而reserve操作则告诉vector容器应该预留多少元素的存储空间。
2、通常来说,除非找到选择使用其他容器的更好理由,否则vector 容器都是最佳选择。
3、除了顺序容器,标准库还提供了三种顺序容器适配器:queue(FIFO queue,简称queue)、priority_queue 和 stack。适配器(adaptor)是标准库中通用的概念,包括容器适配器、迭代器适配器和函数适配器。
4、适配器通用的操作和类型
size_type |
一种类型,足以存储此适配器类型最大对象的长度 |
value_type |
元素类型 |
container_type |
基础容器的类型,适配器在此容器类型上实现 |
A a; |
创建一个新空适配器,命名为 a |
A a(c); |
创建一个名为 a 的新适配器,初始化为容器 c 的副本 |
关系操作符 |
所有适配器都支持全部关系操作符:==、 !=、 <、 <=、 >、>= |
5、默认的stack,queue都基于deque容器实现,而priority_queue则在vector容器上实现。通过将一个顺序容器指定为适配器的第二个类型实参,可覆盖其关联的基础容器类型:
// empty stack implemented on top of vector
stack< string, vector<string> > str_stk;
// str_stk2 is implemented on top of vector and holds a copy of svec
stack<string, vector<string> > str_stk2(svec);
对于给定的适配器,其关联的容器必须满足一定的约束条件。stack适配器所关联的基础容器可以是任意一种顺序容器类型。因此,stack栈可以建立在
vector、list或者deque容器之上。而queue适配器要求其关联的基础容器必须提供push_front运算,因此只能建立在list,deque容器上,而不能建立在vector 容器上。priority_queue 适配器要求提供随机访问功能,因此可建立在vector 或 deque 容器上,但不能建立在 list 容器上。
6、两个相同类型的适配器可以做相等、不等、小于、大于、小于等于以及等于关系比较,只要基础元素类型支持等于和小于操作符既可。这些关系运算由元素依次比较来实现。第一对不相等的元素将决定两者之间的小于或大于关系。
7、栈适配器
s.empty() |
如果栈为空,则返回 true,否则返回 stack |
s.size() |
返回栈中元素的个数 |
s.pop() |
删除栈顶元素的值,但不返回其值 |
s.top() |
返回栈顶元素的值,但不删除该元素 |
s.push(item) |
在栈顶压入新元素 |
所有容器适配器都根据其基础容器类型所支持的操作来定义自己的操作。
8、队列及优先级队列支持的操作
q.empty() |
如果队列为空,则返回 true,否则返回 false |
q.size() |
返回队列中元素的个数 |
q.pop() |
删除队首元素,但不返回其值 |
q.front() |
返回队首元素的值,但不删除该元素。该操作只适用于队列 |
q.back() |
返回队尾元素的值,但不删除该元素。该操作只适用于队列 |
q.top() |
返回具有最高优先级的元素值,但不删除该元素。该操作只适用于优先级队列 |
q.push(item) |
对于 queue,在队尾压入一个新元素,对于 priority_quue,在基于优先级的适当位置插入新元素 |
9、容器定义的操作非常少,只定义了构造函数、添加或删除元素的操作、设置
容器长度的操作以及返回指向特殊元素的迭代器的操作。其他一些有用的操作,
如排序、查找,由标准算法定义。在容器中添加或删除元素可能会使已存在的迭代器失效。
10、所有标准容器类型都是模板类型。标准库容器具有可变的长度。
参考:
[1] http://blog.163.com/zhoumhan_0351/blog/static/399542272010227112325224/
http://blog.163.com/zhoumhan_0351/blog/static/39954227201031114410145/