亚洲免费乱码视频,日韩 欧美 国产 动漫 一区,97在线观看免费视频播国产,中文字幕亚洲图片

      1. <legend id="ppnor"></legend>

      2. 
        
        <sup id="ppnor"><input id="ppnor"></input></sup>
        <s id="ppnor"></s>

        C++函數(shù)對象count_if

        字號:

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