C++的STL适配器

一、背景介绍

适配器在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;
}

输出结果分别为:5050

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;
}

输出结果分别为:65

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容器适配器详

你可能感兴趣的:(C++,c++,开发语言)