赞
踩
适配器在STL组件中,扮演着转换器的角色。适配器是一种在已有容器的基础上,为其增加一些新的特性或功能的方法。而适配器这个概念,就是设计模式中的适配器模式。
注:适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
STL所提供的适配器,可以分为三类:
1、容器适配器,改变容器的接口
2、迭代器适配器,改变迭代器的接口
3、仿函数适配器,改变仿函数的接口
STL提供了序列式容器,同时提供了应用于不同场景的容器适配器。通俗的讲,适配器就是以序列式容器为底层数据结构,为适应场景而进一步封装了的的容器。需要注意的是,适配器不是STL中的容器类型,而是在已有容器上提供了新的接口或功能。
STL中提供了三种容器适配器,分别为stack,queue和priority_queue。默认的情况下,stack和queue基于deque而实的,priority_queue在vector上实现的。queue要求要有push_front操作因此不能建立在vector上面,priority_front要求有随机访问的功能,因此建立在vector上面。
种类 | 默认顺序容器 | 可用顺序容器 | 说明 |
stack | deque | vector、list、deque | |
queue | deque | list、deque | 基础容器必须提供push_front()运算 |
priority_queue | vector | vector、deque | 基础容器必须提供随机访问功能 |
stack的底层由 deque构成从以下接口可清楚看出 stack与 deque的关系
- template <class T, class Sequence = deque<T> >
- class stack
- {
- Sequence c;//底层容器
- ../
- };
下面demo演示了stack适配器类的用法
- #include <iostream>
- #include <queue>
- using namespace std;
-
- #include <iostream>
- #include <stack>
-
- using namespace std;
-
- int main() {
- stack<int> s;
-
- for (int i = 1; i <= 5; i++) s.push(i);
-
- while (!s.empty()) {
- cout << s.top() << " ";
- s.pop();
- }
-
- system("pause");
- return 0;
- }
STL迭代器适配器是一种在已有迭代器的基础上,增加一些新的功能,以满足各种使用需求的方法。包括 insert_iterators、reverse_iterators、iostream_iterators。
3.1、insert_Iterators
用于将元素插入到容器的任意位置中。用法如下:
- #include <iostream>
- #include <vector>
- #include <list>
- #include <iterator>
-
- using namespace std;
-
- int main() {
- vector<int> a = {1, 2, 3};
- list<int> b;
- auto it = back_inserter(b);
- copy(a.begin(), a.end(), it);
- for (auto i : b) cout << i << " ";
- return 0;
- }
3.2、reverse_Iterators
reverse_iterator用于将迭代器进行反转,使原本应该前进的 operator++ 变成了后退操作,使原本应该后退的 operator-- 变成了前进操作。
- #include <iostream>
- #include <vector>
- #include <iterator>
-
- using namespace std;
-
- int main() {
- vector<int> a = {1, 2, 3};
- auto it = a.rbegin();
- while (it != a.rend()) {
- cout << *it << " ";
- it++;
- }
- return 0;
- }
3.3、IOstream_Iterators
用于将容器中的元素输出到输出流中。
- #include <iostream>
- #include <vector>
- #include <iterator>
-
- using namespace std;
-
- int main() {
- vector<int> a = {1, 2, 3};
- copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));
- return 0;
- }
-
- // 输出结果为:1 2 3。
在STL中,仿函数适配器是一种在已有函数对象的基础上,增加一些新的功能,以满足各种使用需求的方法。这些适配器包括绑定(bind)、函数(functiom)、否定(negate)、以及对一般函数或成员函数的修饰。
bind
用于将一个函数对象(函数)的部分参数绑定后返回一个新的函数对象。用法如下:
- #include <iostream>
- #include <functional>
-
- using namespace std;
-
- int foo(int a, int b) {
- return a * b;
- }
-
- int main() {
- auto f1 = bind(foo, 10, placeholders::_1);
- cout << f1(5) << endl;
- auto f2 = bind(foo, placeholders::_2, placeholders::_1);
- cout << f2(5, 10) << endl;
- return 0;
- }
输出结果分别为:50
和50
。
function
用于存储任意可调用对象,包括函数、函数指针、成员函数和仿函数等。用法如下:
- #include <iostream>
- #include <functional>
-
- using namespace std;
-
- int foo(int a, int b) {
- return a * b;
- }
-
- class Foo {
- public:
- int bar(int a, int b) {
- return a + b;
- }
- };
-
- int main() {
- function<int(int, int)> f1 = foo;
- cout << f1(2, 3) << endl;
-
- Foo f;
- function<int(Foo*, int, int)> f2 = &Foo::bar;
- cout << f2(&f, 2, 3) << endl;
-
- return 0;
- }
输出结果分别为:6
和5
。
negate
对于一个一元函数对象,返回其相反数(即对于任意参数x,返回-f(x))。例如:
- #include <iostream>
- #include <functional>
-
- using namespace std;
-
- int main() {
- negate<int> f;
- cout << f(5) << endl;
- return 0;
- }
参考:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。