适配器

Posted ccpang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了适配器相关的知识,希望对你有一定的参考价值。

适配器

adapters是二十三种设计模式之一,STL所提供的配接器中,改变仿函数的接口者,我们称为function adapter。改变容器接口者,我们称为container adapter。改变迭代器接口者,我们称为iterator adapter。
技术图片

容器适配器:stack queue

如下图所示:
技术图片
stack中内含了一个deque,deque可能含有100个函数,但是呢,stack对其进行了一种改造,只开放6个接口,对函数名字的改变也称之为一种改造。

将内含容器(deque)的特性改造为具有自己(stack)的特性的接口。

函数适配器 bind2nd

技术图片

新型适配器 bind

bind可以绑定:

  • functions
  • function objects
  • member functions ,必须是某个object地址
  • data members ,必须是某个object地址
using namespace std::placeholders; /占位符 _1,_2,_3
double my_divide(double x, double y) {
    return x /y;
}
auto fn_five = bind(my_divide,10,2);
cout <<fn_five()

auto fn_half = bind(my_divide,_1,_2);
cout << fn_half(10,2) << endl;

//bind也可以绑定一个参数,例如下面的int,就是返回类型是int
auto fn_rounding = bind<int>(my_divide,1_,_2);
cout <<fn_rounding(10,3) << endl; 

//绑定member functions,必须是某个object地址

//定义类MyPair
struct MyPair {
  double a, b;
  double multply() {return a * b;}
};
//定义类的实例
MyPair ten_two {10,2};
auto bound_memfn = bind(&MyPair::multiply,_1); //returans x.multply(),其实有个参数是this
cout << bound_menfn(ten_two) << endl;

绑定成员数据

auto bound_memdata = bind(&MyPair::a,ten_two);
cout << boud_memdata() << endl;

//求不小于50的数

vector<int> v{15,78,87,781};
int n = count_if(v1.cbegin(),v.cend(), not1(bind2nd(less<int>(),50)));
cout << "n="  << n << endl;

//使用bind的方式求
auto fn_ = bind(less<int>(),_1,50);
cout << count_if(v.cbegin(),v.cend(),fn_)<<endl;

迭代器适配器

以上是关于适配器的主要内容,如果未能解决你的问题,请参考以下文章

如何从片段适配器启动活动

片段中ListView的android自定义适配器

片段内带有基本适配器的列表视图

片段中gridview的Android文本和图像适配器

将值从回收器适配器传递到android中的片段

如何使用 viewpager 和片段为我的 ListView 设置适配器