標準庫提供一組函式介面卡,用來特殊化
或者擴充套件
一元和二元函式物件。常用介面卡是:
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)
class isgreat
bool
operator()(int &num)
return
false;
}protected:
private:
int m_num;
};void main43()
for (vector
::iterator it = v1.begin(); it!=v1.end(); 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的個數 greater() 有2個引數
// param > 2
int num3 = count_if(v1.begin(), v1.end(), bind2nd(greater(), 2 ) );
cout
<< "num3:"
<< num3 << endl;
//取模 能被2整除的數 求奇數
int num4 = count_if(v1.begin(), v1.end(), bind2nd(modulus (), 2 ) );
cout
<< "奇數num4:"
<< num4 << endl;
int num5 = count_if(v1.begin(), v1.end(), not1( bind2nd(modulus (), 2 ) ) );
cout
<< "偶數num5:"
<< num5 << endl;
return ;
}
#include
using
namespace
std;
#include "string"
#include
#include
#include "set"
#include
#include "functional"
//plus預定義好的函式物件 能實現不同型別的資料的 + 運算
//實現了 資料型別 和演算法的分離 ===》通過函式物件技術實現的。。。。
//思考:怎麼樣知道 plus是兩個引數
void main21()
};*/
plus intadd;
int x = 10;
int y = 20;
int z = intadd(x, y); // x + y
cout
<< "z:"
<< z << endl;
plus stringadd;
string s1 = "aaa";
string s2 = "bbb";
string s3 = stringadd(s1, s2);
cout
<< "s3:"
<< s3 << endl;
vector
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");
/*templatestruct greater
: public binary_function<_ty _ty bool>
};*/
sort(v1.begin(), v1.end(), greater() );
for (vector
::iterator it=v1.begin(); it!=v1.end(); it++)
//求 ccc 出現的個數
string sc = "ccc";
//equal_to() 有兩個引數 left引數來自容器,right引數來自sc
//bind2nd函式介面卡 :把預定義函式物件 和 第二個引數進行繫結
int num = count_if(v1.begin(), v1.end(), bind2nd(equal_to(), sc) );
cout
<< "num: "
<< num << endl;
}class isgreat
bool
operator()(int &num)
return
false;
}private:
int m_num;
};void main22()
for (vector
::iterator it=v1.begin(); it!=v1.end(); it++ )
cout
<< endl;
int num1 = count(v1.begin(), v1.end(), 3);
cout
<< "num1:"
<< num1 /通過 謂詞 求大於2 的個數
int num2 = count_if(v1.begin(), v1.end(), isgreat(2));
cout
<< "num2:"
<< num2 *
templatestruct greater
: public binary_function<_ty _ty bool>
};*/
//通過 預定義的函式物件 求大於2 的個數
//greater() 有兩個引數 左引數來自容器的元素 ,右引數固定成2 (通過bind2nd做的)
int num3 = count_if(v1.begin(), v1.end(), bind2nd (greater(), 2) );
cout
<< "num3:"
<< num3 /求 奇數的個數
int num4 = count_if(v1.begin(), v1.end(), bind2nd (modulus(), 2) );
cout
<< "奇數的個數num4:"
<< num4 /求 偶數的個數 取反器(negator)
int num5 = count_if(v1.begin(), v1.end(), not1( bind2nd (modulus(), 2) ) );
cout
<< "偶數的個數 num5:"
<< num5
STL介面卡 函式介面卡
有時候需要對內建函式物件返回值進行進一步的簡單計算,或者填上多餘的引數,不能直接代入演算法。函式介面卡實現了這一功能,函式介面卡是將一種函式物件轉化為另一種符合要求的函式物件。函式介面卡可以分為4個大類 繫結介面卡 組合介面卡 指標函式介面卡和成員函式介面卡。需求 在遍歷容器的時候,將容器中的值全部...
STL之介面卡
注意 需包含標頭檔案 functional 步驟 bind2nd 或者 bind1st 將兩個引數進行繫結 bind2nd 繫結順序是一致 類繼承 binary function 型別1 型別2 返回值型別 加 const 寫法 class myprint public binary functio...
STL之介面卡
摘要 本文主要講了介面卡的一些內容,重要的是了解介面卡使用的步驟。1 include2 include3 include 4 include5 include 67 using namespace std 89 第一步 繫結 資料 bind2nd 10 繼承類 binary function 引數型...