C 函式物件Function Object

2021-09-24 16:21:27 字數 3114 閱讀 1458

class functionobjecttype

};

比一般函式更靈巧,可以擁有狀態

每個函式物件都有型別,可以將函式物件的型別當做template引數傳遞,容器型別也會因為函式物件型別的不同而不同

執行速度比函式指標稍快

std::set要求排序方法有「型別」,所以不能使用普通函式,但是可以使用函式物件。

#include

#include

#include

#include

#include

using namespace std;

class person

string firstname()

const

string lastname()

const

private:

string _firstname = nullptr;

string _lastname = nullptr;};

class personsortcriterion};

intmain

(void

)return0;

}

只要改變operator()就可以產生複雜的序列。

預設情況下,函式物件進行值傳遞,一次演算法不會改變函式物件的狀態。

如:

intsequence seq(1

);std::

generate_n

(back_inserter

(coll),9

, seq)

;

這種方式會使得從一開始產生序列。

#include

#include

#include

#include

class

intsequence

intoperator()

()intgetvalue()

};intmain

(void

) std::cout << std::endl;

//替換第二個數到最後乙個數

std::

generate

(std::

next

(coll.

begin()

),std::

prev

(coll.

end())

,intsequence(42

));for

(auto i : coll)

std::cout << std::endl;

return0;

}

方法有三種:

在外部持有狀態,並讓函式物件指向它

以引用方式傳遞函式物件

利用for_each()演算法的返回值

第一種方法:

#include

#include

#include

#include

class

intsequence

intoperator()

()intgetvalue()

};intmain

(void

) std::cout << std::endl;

std::cout <<

"a = "

<< a << std::endl;

//再次插入10~13

std::

generate_n

(std::

back_inserter

(coll),4

, seq)

;for

(auto i : coll)

std::cout << std::endl;

std::cout <<

"a = "

<< a << std::endl;

return0;

}

第二種方法:

#include

#include

#include

#include

class

intsequence

intoperator()

()intgetvalue()

};intmain

(void

) std::cout << std::endl;

std::cout << seq.

getvalue()

<< std::endl;

//再次插入42~45

std::

generate_n

(std::

back_inserter

(coll),4

,intsequence(42

));for

(auto i : coll)

std::cout << std::endl;

std::cout << seq.

getvalue()

<< std::endl;

return0;

}

第三種方法:for_each()演算法可以回傳函式物件的狀態

在這個程式中for_each()會返回函式物件,也就是以乙個meanvalue物件

#include

#include

#include

class

meanvalue

void

operator()

(int elem)

double

meanvalue()

};intmain

(void);

meanvalue mv = std::

for_each

(coll.

begin()

,coll.

end(),

meanvalue()

);std::cout <<

"mean value = "

<< mv.

meanvalue()

<< std::endl;

return0;

}

c 函式物件

標準庫里的count if可以統計容器中滿足特定條件的元素的個數。例如要統計乙個整數vector ivec中正數的個數,可以先寫乙個返回型別為bool,含有乙個int引數的條件函式 class pred 這樣,剛才的統計語句就應該寫成 count if ivec.begin ivec.end pre...

C 函式物件

標準庫里的count if可以統計容器中滿足特定條件的元素的個數。例如要統計乙個整數vector ivec中正數的個數,可以先寫乙個返回型別為bool,含有乙個int引數的條件函式 bool pred int val 之後可以用count if ivec.begin ivec.end pred 計算...

C 函式物件

函式物件實質上是乙個實現了operator 括號操作符過載 的類。它與函式指標用法一樣,但是它有乙個優點,函式指標不可以傳遞附加資料過去,但是在函式物件中,我們可以傳遞附加資料過去。先講解下運算子過載吧,對於運算子函式我們有兩種定義方式,1,如果此函式是屬於乙個類的成員函式,那麼我們是這麼定義的 參...