我是靠谱客的博主 生动衬衫,这篇文章主要介绍C++ Primer 学习笔记_33_STL实践与分析(7) --容器适配器 STL实践与分析 ,现在分享给大家,希望可以做个参考。

STL实践与分析

--容器适配器



引:

除了顺序容器。标准库还提供了三种顺序容器适配器:queue,priority_queuestack。适配器是标准库中的概念。包含容器适配器,迭代器适配器和函数适配器。

适配器通用的操作和类型

size_type

一种类型,足以存储此适配器类型的最大对象长度

value_type

0

container_type

基础容器类型,适配器在此容器类型上实现

Aa;

创建一个空适配器,命名为a

Aa(c);

创建一个名为a的新适配器。初始化为c的副本

关系操作符

所有的适配器都支持所有关系操作符:==,!=,<,<=,>,>=


1、使用适配器时,必须包括相关头文件:

复制代码
1
2
3
#include <stack> #include <queue>

2、覆盖基础容器类型

    默认的queuestack都是基于deque实现,而priority_queue则再vector容器上实现,在创建适配器时,通过将一个顺序容器指定为适配器的第二个类型实參,可覆盖其关联的基础容器类型:

复制代码
1
2
3
4
5
6
7
8
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栈能够建立在vectorlist或者 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)

再栈顶压入元素

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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提供的操作来实现栈功能

比如,运行以下的语句:

复制代码
1
2
3
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同意用户为队列中存储的元素设置优先级

这样的队列不是直接将新元素放置在队列尾部,而是放在比它优先级低的元素前面标准库默认使用元素类型的<操作符来确定它们之间的优先级关系

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//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(); } }

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//习题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(); } }

版权声明:本文博客原创文章,博客,未经同意,不得转载。






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4754854.html,如需转载请自行联系原作者


最后

以上就是生动衬衫最近收集整理的关于C++ Primer 学习笔记_33_STL实践与分析(7) --容器适配器 STL实践与分析 的全部内容,更多相关C++内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部