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,如果此函式是屬於乙個類的成員函式,那麼我們是這麼定義的 參...