標準庫里的count_if可以統(tǒng)計容器中滿足特定條件的元素的個數(shù)。例如要統(tǒng)計一個整數(shù)vector——ivec中正數(shù)的個數(shù),可以先寫一個返回類型為bool,含有一個int參數(shù)的條件函數(shù): bool pred(int val)...{
return val>0;
}
之后可以用count_if(ivec.begin(),ivec.end(),pred)計算出正整數(shù)的個數(shù)。但這個方法有一個明顯的缺陷:如果要統(tǒng)計大于10的個數(shù)、大于100的個數(shù)……就要寫很多個類似的函數(shù),能不能進一步抽象?如果能像這樣調(diào)用count_if:count_if(ivec.begin(),ivec.end,pred(n)),就能統(tǒng)計出容器里大于n的個數(shù),那該多好呀。函數(shù)對象提供了這樣一種機制。
簡單地說,函數(shù)對象就是一個重載了()運算符的對象,它可以像一個函數(shù)一樣使用。例如這個Add類:
class Add...{
public:
int operator()(int v1, int v2)...{
return v1+v2;
}
}; 它能夠進行加法運算。例如: int a1=3,a2=1;
Add add;
cout< 結(jié)果將是4。那么這種機制怎樣用在剛才的問題上呢?因為count_if的第三個參數(shù)是一個接受一個參數(shù)的函數(shù),所以可以通過一個構(gòu)造函數(shù)將這個參數(shù)傳到對象里,由count_if自動調(diào)用這個函數(shù)對象:
class Pred...{
private:
int _val;
public:
Pred(int val):_val(val)...{}
bool operator()(int val)...{
return val>_val;
}
};
于是,要統(tǒng)計大于100的個數(shù),就可以寫成:count_if(ivec.begin(),ivec.end(),Pred(100))。Pred(100)構(gòu)造一個函數(shù)對象,count_if把這個對象依次應(yīng)用到容器中的每一個元素,只要它返回一個真值,計數(shù)器就加1。
如果再利用模板技術(shù),則可以應(yīng)用到各種類型的容器上:
template
class Pred...{
private:
T _val;
public:
Pred(T val):_val(val)...{}
bool operator()(T val)...{
return val>_val;
}
}; 這樣,剛才的統(tǒng)計語句就應(yīng)該寫成:count_if(ivec.begin(),ivec.end(),Pred(100))。如果容器是double類型的,只需把尖括號里的int換成double即可。
return val>0;
}
之后可以用count_if(ivec.begin(),ivec.end(),pred)計算出正整數(shù)的個數(shù)。但這個方法有一個明顯的缺陷:如果要統(tǒng)計大于10的個數(shù)、大于100的個數(shù)……就要寫很多個類似的函數(shù),能不能進一步抽象?如果能像這樣調(diào)用count_if:count_if(ivec.begin(),ivec.end,pred(n)),就能統(tǒng)計出容器里大于n的個數(shù),那該多好呀。函數(shù)對象提供了這樣一種機制。
簡單地說,函數(shù)對象就是一個重載了()運算符的對象,它可以像一個函數(shù)一樣使用。例如這個Add類:
class Add...{
public:
int operator()(int v1, int v2)...{
return v1+v2;
}
}; 它能夠進行加法運算。例如: int a1=3,a2=1;
Add add;
cout< 結(jié)果將是4。那么這種機制怎樣用在剛才的問題上呢?因為count_if的第三個參數(shù)是一個接受一個參數(shù)的函數(shù),所以可以通過一個構(gòu)造函數(shù)將這個參數(shù)傳到對象里,由count_if自動調(diào)用這個函數(shù)對象:
class Pred...{
private:
int _val;
public:
Pred(int val):_val(val)...{}
bool operator()(int val)...{
return val>_val;
}
};
于是,要統(tǒng)計大于100的個數(shù),就可以寫成:count_if(ivec.begin(),ivec.end(),Pred(100))。Pred(100)構(gòu)造一個函數(shù)對象,count_if把這個對象依次應(yīng)用到容器中的每一個元素,只要它返回一個真值,計數(shù)器就加1。
如果再利用模板技術(shù),則可以應(yīng)用到各種類型的容器上:
template
class Pred...{
private:
T _val;
public:
Pred(T val):_val(val)...{}
bool operator()(T val)...{
return val>_val;
}
}; 這樣,剛才的統(tǒng)計語句就應(yīng)該寫成:count_if(ivec.begin(),ivec.end(),Pred