C++ Primer 学习笔记_33_STL实践与分析(7) --容器适配器
STL实践与分析
--容器适配器
引:
除了顺序容器。标准库还提供了三种顺序容器适配器:queue,priority_queue和stack。适配器是标准库中的概念。包含容器适配器,迭代器适配器和函数适配器。
|
适配器通用的操作和类型 |
|
|---|---|
|
size_type |
一种类型,足以存储此适配器类型的最大对象长度 |
|
value_type |
0 |
|
container_type |
基础容器类型,适配器在此容器类型上实现 |
|
Aa; |
创建一个空适配器,命名为a |
|
Aa(c); |
创建一个名为a的新适配器。初始化为c的副本 |
|
关系操作符 |
所有的适配器都支持所有关系操作符:==,!=,<,<=,>,>= |
1、使用适配器时,必须包括相关头文件:
#include <stack>
#include <queue>
2、覆盖基础容器类型
默认的queue和stack都是基于deque实现,而priority_queue则再vector容器上实现,在创建适配器时,通过将一个顺序容器指定为适配器的第二个类型实參,可覆盖其关联的基础容器类型:
stack<string> strStk;
stack< string,vector<string> > str_stk;
stack< string,vector<string> > str_stk2(strStk); //Error
stack< string,vector<string> > str_stk3(str_stk); //OK
stack适配器所关联的基础容器能够是随意一种顺序容器类型。
因此,stack栈能够建立在vector、list或者
deque容器之上。
而queue适配器要求其关联的基础容器必须提供push_front运算,因此仅仅能建立在list容器上,而不能建立在vector容器上。
priority_queue适配器要求提供随机訪问功能,因此可建立在vector或
deque容器上,但不能建立在list容器上。
3、适配器的关系运算由当中的元素依次比較来实现
一、栈适配器
|
栈容器适配器支持的操作 |
|
|---|---|
|
s.empty() |
假设栈为空。则返回true。否则返回false |
|
s.size() |
返回栈中元素的个数 |
|
s.pop() |
删除栈顶元素,但不返回其值 |
|
s.top() |
返回栈顶元素,但不删除该元素 |
|
s.push(item) |
再栈顶压入元素 |
const stack<int>::size_type stk_size = 10;
stack<int> intStk; int ix = 0;
while (intStk.size() != stk_size)
{
intStk.push(ix ++);
} int err_cnt = 0;
while (!intStk.empty())
{
int val = intStk.top();
if (val != --ix)
{
cerr << "oops! expected " << ix
<< " received " << val << endl;
++err_cnt;
}
intStk.pop();
} cout << "Our Program ran with " << err_cnt << " errors!" << endl;
默认情况下,栈适配器建立在deque容器上,因此採用deque提供的操作来实现栈功能。
比如,运行以下的语句:
intStack.push(ix++);
这个操作通过调用push_back操作实现,而该intStk所基于的
deque对象提供。
虽然栈是以deque容器为基础实现的,可是程序猿不能直接訪问deque所提供的操作。
二、队列和优先级队列
使用这两种队列,必须包括queue头文件。
|
队列和优先级队列支持的操作 |
|
|---|---|
|
q.empty() |
假设队列为空。则返回true,否则返回false |
|
q.size() |
返回队列中元素的个数 |
|
q.pop() |
删除队首元素,但不返回其值 |
|
q.front() |
返回队首元素,但不删除该元素 该操作仅仅适用于队列 |
|
q.back() |
返回对尾元素,但不删除该元素 该操作仅仅适用于队列 |
|
q.top() |
返回具有最高优先级的元素值,但不删除该元素 该操作仅仅适用于优先级队列 |
|
q.push(item) |
对于queue,在队尾插入一个新的元素。 对于priority_queue,在基于优先级的适当位置插入新元素 |
priority_queue同意用户为队列中存储的元素设置优先级。
这样的队列不是直接将新元素放置在队列尾部,而是放在比它优先级低的元素前面。标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。
//P302 习题9.42
int main()
{
// freopen("input","r",stdin);
stack<string> strStk;
string val; while (cin >> val)
{
strStk.push(val);
} while (!strStk.empty())
{
val = strStk.top();
cout << val << endl;
strStk.pop();
}
}
//习题9.43
int main()
{
freopen("input","r",stdin);
stack<char> sexp;
string exp;
cin >> exp; string::iterator iter = exp.begin();
while (iter != exp.end())
{
if (*iter != ')')
{
sexp.push(*iter);
}
else
{
while (!sexp.empty() && sexp.top() != '(')
{
cout << sexp.top() << endl;
sexp.pop();
}
if (sexp.top() == '(')
{
sexp.pop();
sexp.push('@');
}
else
{
cerr << "No match ( !" << endl;
return 0;
}
}
++iter;
} while (!sexp.empty())
{
cout << sexp.top() << endl;
sexp.pop();
}
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
C++ Primer 学习笔记_33_STL实践与分析(7) --容器适配器的更多相关文章
- C++ Primer 学习笔记_29_STL实践与分析(3) --操作步骤集装箱(下一个)
STL实践与分析 --顺序容器的操作(下) 六.訪问元素 假设容器非空,那么容器类型的front和back成员将返回容器的第一个和最后一个元素的引用. [与begin和end的对照:] 1)begin ...
- C++ Primer 学习笔记_32_STL实践与分析(6) --再谈string类型(下)
STL实践与分析 --再谈string类型(下) 四.string类型的查找操作 string类型提供了6种查找函数,每种函数以不同形式的find命名.这些操作所有返回string::size_typ ...
- C++ Primer 学习笔记_35_STL实践与分析(9)--map种类(在)
STL实践与分析 --map类型(上) 引: map是键-值对的集合. map类型通常能够理解为关联数组:能够通过使用键作为下标来获取一个值,正如内置数组类型一样:而关联的本质在于元素的值与某个特定的 ...
- C++ Primer 学习笔记_43_STL实践与分析(17)--再谈迭代器【中】
STL实践与分析 --再谈迭代器[中] 二.iostream迭代[续] 3.ostream_iterator对象和ostream_iterator对象的使用 能够使用ostream_iterator对 ...
- C++ Primer 学习笔记_46_STL实践与分析(20)--容器特有的算法
STL实践与分析 --容器特有的算法 与其它顺序容器所支持的操作相比,标准库为list容器定义了更精细的操作集合,使它不必仅仅依赖于泛型操作.当中非常大的一个原因就是list容器不是依照内存中的顺序进 ...
- C++ Primer 学习笔记_44_STL实践与分析(18)--再谈迭代器【下】
STL实践与分析 --再谈迭代器[下] 三.反向迭代器[续:习题] //P355 习题11.19 int main() { vector<int> iVec; for (vector< ...
- C++ Primer 学习笔记_40_STL实践与分析(14)--概要、先来看看算法【上】
STL实践与分析 --概述.初窥算法[上] 标准库容器定义的操作很少.并没有给容器加入大量的功能函数.而是选择提供一组算法,这些算法大都不依赖特定的容器类型,是"泛型"的. ...
- C++ Primer 学习笔记_45_STL实践与分析(19)--建筑常规算法
STL实践与分析 --泛型算法的结构 引言: 正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础. 算法最主要的性质是须要使用的迭代器种类.全部算法都指定了它的每一个迭代器形參可使用 ...
- C++ Primer 学习笔记_41_STL实践与分析(15)--先来看看算法【下一个】
STL实践与分析 --初窥算法[下] 一.写容器元素的算法 一些算法写入元素值.在使用这些算法写元素时一定要当心.必须.写入输入序列的元素 写入到输入序列的算法本质上是安全的--仅仅会写入与指定输入范 ...
随机推荐
- loj1341(数学)
传送门:Aladdin and the Flying Carpet 题意: 给出两个正整数1<=m<=n<=1e12.问N可以拆成多少对p*q,使得p和q中最小的不小于a,且p!=q ...
- undefined reference to `sin'问题解决
作者:zhanhailiang 日期:2014-10-25 使用gcc编译例如以下代码时报"undefined reference to `sin'": #include < ...
- 【ArcGIS 10.2新特性】ArcGIS 10.2 for Server新特性
ArcGIS forServer相关的很多重大消息,如与Portal for ArcGIS进行了集成,提供对实时数据支持.离线地图使用. 1.与Portal for ArcGIS集成 用户能够配置Po ...
- ORA-12520错误解决一则
问题描写叙述: 今天突然发现连接数据库时报错,用pl/sql dev连接数据时,有时能连接上,有时连接时报: ORA-12520: TNS: 监听程序无法找到须要的server类型的可用句柄 通过se ...
- Java集群--大型网站是怎样解决多用户高并发访问的
时间过得真快,再次登录博客园来写博,才发现距离上次的写博时间已经过去了一个月了,虽然是因为自己找了实习,但这也说明自己对时间的掌控能力还是没那么的强,哈哈,看来还需不断的努力啊!(这里得特别说明一下本 ...
- 《火球——UML大战需求分析》(第1章 大话UML)——1.3 行为型的UML(Behavior Diagram)
说明: <火球——UML大战需求分析>是我撰写的一本关于需求分析及UML方面的书,我将会在CSDN上为大家分享前面几章的内容,总字数在几万以上,图片有数十张.欢迎你按文章的序号顺序阅读,谢 ...
- SEAndroid安全机制中的进程安全上下文关联分析
前面一篇文章分析了文件安全上下文关联过程.可是在SEAndroid中,除了要给文件关联安全上下文外,还须要给进程关联安全上下文.由于仅仅有当进程和文件都关联安全上下文之后,SEAndroid安全策略才 ...
- 一位同学3年通过CPA, CFA, ACCA的经验
3 年从 ACCA!!! 今天收到 ACCA,只去考了一门,因为要下 field,可恶的 H R 和 manager 都不批准我的假.不过还好,功夫不负有心人,CPA 了,也是本科毕业那年. 本科结束 ...
- Hadoop单机版安装,配置,运行
Hadoop是最近非常流行的东东啦,但是乍一看都觉得是集群的东东,其实在单机版上安装Hadoop也是可以的,并且安装好以后可以很方便的进行程序的调试,调试好程序以后再丢到集群中,放心的算吧,呵呵.. ...
- 大约 Apple Metal API 一些想法
看后 Metal 的开发文档后,除了官方所宣称的一些长处外(比方说更easy理解和使用的 API.更直接和精细的硬件控制,降低 GPU 使用过程中的 CPU 额外开销等等),从我有限的 GLES 开发 ...