适配器在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 stack
{
Sequence c;//底层容器
../
};
下面demo演示了stack适配器类的用法
#include
#include
using namespace std;
#include
#include
using namespace std;
int main() {
stack 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
#include
#include
#include
using namespace std;
int main() {
vector a = {1, 2, 3};
list 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
#include
#include
using namespace std;
int main() {
vector a = {1, 2, 3};
auto it = a.rbegin();
while (it != a.rend()) {
cout << *it << " ";
it++;
}
return 0;
}
3.3、IOstream_Iterators
用于将容器中的元素输出到输出流中。
#include
#include
#include
using namespace std;
int main() {
vector a = {1, 2, 3};
copy(a.begin(), a.end(), ostream_iterator(cout, " "));
return 0;
}
// 输出结果为:1 2 3。
在STL中,仿函数适配器是一种在已有函数对象的基础上,增加一些新的功能,以满足各种使用需求的方法。这些适配器包括绑定(bind)、函数(functiom)、否定(negate)、以及对一般函数或成员函数的修饰。
bind
用于将一个函数对象(函数)的部分参数绑定后返回一个新的函数对象。用法如下:
#include
#include
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
#include
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 f1 = foo;
cout << f1(2, 3) << endl;
Foo f;
function f2 = &Foo::bar;
cout << f2(&f, 2, 3) << endl;
return 0;
}
输出结果分别为:6
和5
。
negate
对于一个一元函数对象,返回其相反数(即对于任意参数x,返回-f(x))。例如:
#include
#include
using namespace std;
int main() {
negate f;
cout << f(5) << endl;
return 0;
}
参考:
C++ STL(第四篇:适配器)_YoungYangD的博客-CSDN博客_stl适配器
STL学习系列之六—容器适配器_飞天絮雪的博客-CSDN博客d
C++ STL priority_queue容器适配器详