玉林网站设计,做编程的 网站有哪些内容,东莞短视频推广属于什么,郑州网站建设哪家好怎么样1.理论知识 2.常用函数适配器
标准库提供一组函数适配器#xff0c;用来特殊化或者扩展一元和二元函数对象。常用适配器是#xff1a;
1绑定器#xff08;binder#xff09;:
binder通过把二元函数对象的一个实参绑定到一个特殊的值上#xff0c;将其转换成一元函数对象…1.理论知识 2.常用函数适配器
标准库提供一组函数适配器用来特殊化或者扩展一元和二元函数对象。常用适配器是
1绑定器binder:
binder通过把二元函数对象的一个实参绑定到一个特殊的值上将其转换成一元函数对象。C标准库提供两种预定义的binder适配器bind1st和bind2nd前者把值绑定到二元函数对象的第一个实参上后者绑定在第二个实参上。
2取反器(negator) :
negator是一个将函数对象的值翻转的函数适配器。标准库提供两个预定义的ngeator适配器not1翻转预定义一元函数对象的真值,而not2翻转二元谓词函数的真值。
常用函数适配器列表如下
bind1st(op, value)
bind2nd(op, value)
not1(op)
not2(op)
mem_fun_ref(op)
mem_fun(op)
ptr_fun(op)
3.典型案例
class IsGreat
{
public:IsGreat(int i){m_num i;}bool operator()(int num){if (num m_num){return true;}return false;}
protected:
private:int m_num;
};void main43()
{vectorint v1;for (int i0; i5; i){v1.push_back(i1);}for (vectorint::iterator it v1.begin(); it!v1.end(); it ){cout *it ;}int num1 count(v1.begin(), v1.end(), 3);cout num1: num1 endl;//通过谓词求大于2的个数int num2 count_if(v1.begin(), v1.end(), IsGreat(2)); cout num2: num2 endl;//通过预定义函数对象求大于2的个数 greaterint() 有2个参数 // param 2int num3 count_if(v1.begin(), v1.end(), bind2nd(greaterint(), 2 ) );cout num3: num3 endl;//取模 能被2整除的数 求奇数int num4 count_if(v1.begin(), v1.end(), bind2nd(modulus int(), 2 ) ); cout 奇数num4: num4 endl;int num5 count_if(v1.begin(), v1.end(), not1( bind2nd(modulus int(), 2 ) ) ); cout 偶数num5: num5 endl;return ;
}
4.预定义函数对象和适配器案例代码
#include iostream
using namespace std;#include string
#include vector
#include list
#include set
#include algorithm
#include functional//plusint 预定义好的函数对象 能实现不同类型的数据的 运算
//实现了 数据类型 和算法的分离 》通过函数对象技术实现的。。。。//思考怎么样知道 plustype 是两个参数
void main21()
{/*templateclass _Tystruct plus: public binary_function_Ty, _Ty, _Ty{ // functor for operator_Ty operator()(const _Ty _Left, const _Ty _Right) const{ // apply operator to operandsreturn (_Left _Right);}};*/plusint intAdd;int x 10; int y 20;int z intAdd(x, y); // x y cout z: z endl;plusstring stringAdd;string s1 aaa;string s2 bbb;string s3 stringAdd(s1, s2);cout s3: s3 endl;vectorstring v1;v1.push_back(bbb);v1.push_back(aaa);v1.push_back(ccc);v1.push_back(zzz);v1.push_back(ccc);v1.push_back(ccc);/*templateclass _Tystruct greater: public binary_function_Ty, _Ty, bool{ // functor for operatorbool operator()(const _Ty _Left, const _Ty _Right) const{ // apply operator to operandsreturn (_Left _Right);}};*/sort(v1.begin(), v1.end(), greaterstring() );for (vectorstring::iterator itv1.begin(); it!v1.end(); it){cout *it endl;}//求 ccc 出现的个数string sc ccc;//equal_tostring() 有两个参数 left参数来自容器right参数来自sc//bind2nd函数适配器 把预定义函数对象 和 第二个参数进行绑定int num count_if(v1.begin(), v1.end(), bind2nd(equal_tostring(), sc) );cout num: num endl;
}class IsGreat
{
public:IsGreat(int i){m_num i;}bool operator()(int num){if (num m_num){return true;}return false;}
private:int m_num;
};void main22()
{vectorint v1;for (int i0; i10; i){v1.push_back(i1);}for (vectorint::iterator itv1.begin(); it!v1.end(); it ){cout *it ;}cout endl;int num1 count(v1.begin(), v1.end(), 3);cout num1: num1 endl;//通过 谓词 求大于2 的个数int num2 count_if(v1.begin(), v1.end(), IsGreat(2));cout num2: num2 endl;/*templateclass _Tystruct greater: public binary_function_Ty, _Ty, bool{ // functor for operatorbool operator()(const _Ty _Left, const _Ty _Right) const{ // apply operator to operandsreturn (_Left _Right);}};*///通过 预定义的函数对象 求大于2 的个数//greaterint() 有两个参数 左参数来自容器的元素 右参数固定成2 通过bind2nd做的int num3 count_if(v1.begin(), v1.end(), bind2nd (greaterint(), 2) );cout num3: num3 endl;//求 奇数的个数int num4 count_if(v1.begin(), v1.end(), bind2nd (modulusint(), 2) );cout 奇数的个数num4: num4 endl;//求 偶数的个数 取反器(negator) int num5 count_if(v1.begin(), v1.end(), not1( bind2nd (modulusint(), 2) ) );cout 偶数的个数 num5: num5 endl;}
void main2222()
{//main21();main22(); //函数适配器综合案例couthello...endl;system(pause);return ;
}