新聞中心
目錄
一.函數(shù)對象Function Object的原理
二.使用函數(shù)對象的意義
三.實現(xiàn)一個函數(shù)對象Function Object完成容器元素的過濾
四.查找函數(shù)find()和find_if()的區(qū)別:
一.函數(shù)對象Function Bbject的原理
1.函數(shù)對象即為一個重載了括號 " ( ) " 的對象。當(dāng)該對象調(diào)用此操作符時,其表現(xiàn)形式就如同普通函數(shù)的調(diào)用一般。
2.具體實現(xiàn):
①.函數(shù)對象的定義:
class Fuction_object
{
public:
bool operator() (int _value)
{
return val< _value;
};
private:
int val;
};
②.函數(shù)對象的調(diào)用:通過定義的類創(chuàng)建函數(shù)對象,再以一般函數(shù)調(diào)用的方式調(diào)用該函數(shù)對象
Function_object F_O(10);
F_O(5);
二.使用函數(shù)對象的意義1.函數(shù)對象擁有自己的狀態(tài)。程序員可以在類中定義狀態(tài)變量,這樣的一個函數(shù)對象在多次的調(diào)用中可以共享狀態(tài)。(函數(shù)調(diào)用不存在這種優(yōu)勢)
2.函數(shù)對象有自己特有的類型,而普通函數(shù)無類型一說。(通過此特性,在使用STL中的函數(shù)時,可以傳遞相應(yīng)的類型作為參數(shù)來實例化相應(yīng)的模板,從而實現(xiàn)相應(yīng)的功能)
eg:
class Fuction_object
{
public:
bool operator() (int _value)
{
return val< _value;
};
private:
int val;
};
int main()
{
Function_object F_O(10);
F_O(5);
int a[5] = {10,2,4,5,9};
vectorvec(a,a+5);
vector::iterator it = vec.begin();
int counts = 0;
while(find_if(it,vec.end(),F_0)!=vec.end())
{
counts++;
it++;
};
system("pause");
return 0;
}
通過函數(shù)對象作為中函數(shù)sort()的參數(shù)完成對容器中元素的過濾。
三.實現(xiàn)一個函數(shù)對象Function Object完成容器元素的過濾C++實現(xiàn)代碼:
//function_object.h
#pragma once
#ifndef _FUNCTION_OBJECT_H_
#define _FUNCTION_OBJECT_H_
class LessThan
{
private:
int _val;
public:
LessThan(int val) :_val(val) { }
int comp_val1() const { return _val; }
void comp_val2(int nval) { _val = nval; }
bool operator() (int _value) const; //實現(xiàn)函數(shù)對象的根本
};
#endif
//function_object.cpp
#include"function_object.h"
bool LessThan::operator()(int _value)const
{
return _value< _val; // _val是創(chuàng)建函數(shù)對象時就設(shè)定好的一個右操作數(shù),而_value則是調(diào)用函數(shù)對象時傳入的左操作數(shù)
}
//main.cpp
#include"function_object.h"
#include //find_if()
#include#includeusing namespace std;
int count_less_than(const vector& vec, int comp)
{
LessThan lt(comp); //創(chuàng)建函數(shù)對象function object
int counts = 0;
for (int ix = 0; ix< vec.size(); ix++)
{
if (lt(vec[ix]))
{
counts++;
}
}
return counts;
}
void print_less_than(const vector& vec, int comp)
{
LessThan lt(comp);
vector::const_iterator it = vec.begin();
cout<< "element less than "<< lt.comp_val1()<< endl;
while (it != vec.end())
{
if ((it = find_if(it, vec.end(), lt)) != vec.end())
{
cout<< *it<< " ";
it++;
}
}
}
int main()
{
int ia[10] = { 17,12,44,27,55,8,23,9,6,14 };
vectorvec(ia, ia + 10);
int comp_val = 20;
cout<< "Number of elements less than "
<< comp_val<< " are "
<< count_less_than(vec, comp_val)<< endl;
print_less_than(vec, comp_val);
system("pause");
return 0;
}
_val是創(chuàng)建函數(shù)對象時就設(shè)定好的一個右操作數(shù),而_value則是調(diào)用函數(shù)對象時傳入的左操作數(shù)
bool LessThan::operator()(int _value)const
{
return _value< _val;
// _val是創(chuàng)建函數(shù)對象時就設(shè)定好的一個右操作數(shù),而_value則是調(diào)用函數(shù)對象時傳入的左操作數(shù)
}
四.頭文件中的查找函數(shù)find()和find_if()的區(qū)別:1.find查找函數(shù)原型為find(_InIt _First, const _InIt _Last, const??_Ty& _Val)
其中
first 為迭代器起始位置
last為迭代器起始位置
val為查找數(shù)據(jù)
2.find_if查找函數(shù)原型為find_if(_InIt _First, const _InIt _Last, _Pr _Pred)
其中
first 為迭代器起始位置
last為迭代器起始位置
Pr _Pred是謂詞,需要自己創(chuàng)建(函數(shù)對象經(jīng)常用于此處)
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)頁標(biāo)題:函數(shù)對象FunctionObject-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://www.dlmjj.cn/article/desphd.html