37STL之函式介面卡

2021-08-02 20:31:05 字數 4133 閱讀 4828

標準庫提供一組函式介面卡,用來特殊化或者擴充套件一元和二元函式物件。常用介面卡是:

1繫結器(binder):

binder通過把二元函式物件的乙個實參繫結到乙個特殊的值上,將其轉換成一元函式物件。c++標準庫提供兩種預定義的binder介面卡:bind1stbind2nd,前者把值繫結到二元函式物件的第乙個實參上,後者繫結在第二個實參上。

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 引數型...