STL_算法_元素计数(count、count_if)

 C++ Primer 学习中。。

 

简单记录下我的学习过程 (代码为主)

 

count 、 count_if

 

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;

/***********************
count
count_if
关联容器的等效成员函数
    set.count
    multiset.count
    map.count
    multimap.count
************************/
/***********************  std::count:****************************************
template <class InputIterator, class T>
  typename iterator_traits<InputIterator>::difference_type
    count ( ForwardIterator first, ForwardIterator last, const T& value );
//eg:
template <class InputIterator, class T>
  ptrdiff_t count ( InputIterator first, InputIterator last, const T& value )
{
  ptrdiff_t ret=0;
  while (first != last) if (*first++ == value) ++ret;
  return ret;
}
*******************************************************************************/

/***********************  std::count_if:****************************************
template <class InputIterator, class Predicate>
  typename iterator_traits<InputIterator>::difference_type
    count_if ( ForwardIterator first, ForwardIterator last, Predicate pred );
//eg:
template <class InputIterator, class Predicate>
  ptrdiff_t count_if ( InputIterator first, InputIterator last, Predicate pred )//pred 为函数or函数对象
{
  ptrdiff_t ret=0;
  while (first != last) if (pred(*first++)) ++ret;
  return ret;
}
*******************************************************************************/

//奇数
bool IsOdd (int i)
{
    return i&1;
}

int main()
{
    int mycount;

    // counting elements in array:
    int myints[] = {10,20,30,30,20,10,10,20};   // 8 elements
    mycount = (int) count (myints, myints+8, 10);
    cout << "10 appears " << mycount << " times.\n";

    // counting elements in container:
    vector<int> myvector (myints, myints+8);
    mycount = (int) count (myvector.begin(), myvector.end(), 20);//有几个20
    cout << "20 appears " << mycount  << " times.\n";

    /****************
    Output:
    10 appears 3 times.
    20 appears 3 times.
    ****************/

//    vector<int> myvector;
    myvector.clear();
    for (int i=1; i<10; i++) myvector.push_back(i); // myvector: 1 2 3 4 5 6 7 8 9

    cout<<"\nmyvector: 1 2 3 4 5 6 7 8 9 \n";
//    mycount = (int) count_if (myvector.begin(), myvector.end(), IsOdd);
    mycount = (int) count_if (myvector.begin(), myvector.end(), bind2nd(modulus<int>(),2));//表示param1 % 2
    cout << "myvector contains " << mycount  << " odd values.\n";//奇数
//  假设求偶数的个数                                            not1,1表示一个參数取反
    mycount = (int) count_if (myvector.begin(), myvector.end(), not1(bind2nd(modulus<int>(),2)));//表示!(param1 % 2)
    cout << "myvector contains " << mycount  << " even values.\n";//偶数
    /****************
    Output:
    myvector contains 5 odd values.
    ****************/
//                                               函数适配器  函数对象
//         bind2nd(op,value);表示绑定第二个数                   param1 > 4  这里表示统计大于4的个数
    mycount=count_if(myvector.begin(),myvector.end(),bind2nd(greater<int>(),4));
    cout<<"有"<<mycount<<"个数大于4"<<endl;
//拓展练习                                                      4 > param2
    mycount=count_if(myvector.begin(),myvector.end(),bind1st(greater<int>(),4));
    cout<<"有"<<mycount<<"个数小于4"<<endl;
//                                                              4 < param2
    mycount=count_if(myvector.begin(),myvector.end(),bind1st(less<int>(),4));
    cout<<"有"<<mycount<<"个数大于4"<<endl;
//                                                              param1 >= 4
    mycount=count_if(myvector.begin(),myvector.end(),bind2nd(greater_equal<int>(),4));
    cout<<"有"<<mycount<<"个数大于等于4"<<endl;
//                                                              param1 <= 4
    mycount=count_if(myvector.begin(),myvector.end(),bind2nd(less_equal<int>(),4));
    cout<<"有"<<mycount<<"个数小于等于4"<<endl;

/****关联容器****/
    multiset<int> ms(myvector.begin(),myvector.end());
    ms.insert(myvector.begin(),myvector.begin()+6);
    ms.insert(myvector.begin(),myvector.begin()+4);
    ms.insert(myvector.begin(),myvector.begin()+2);
    ms.insert(1);

    multiset<int>::iterator ims=ms.begin();
    while(ims!=ms.end()){
        cout<<*ims++<<" ";
    }cout<<endl;

//两种方法求1的个数
    int cnt=count(ms.begin(),ms.end(),1);//全部容器适用可是比較慢些
    cout<<"multiset里有"<<cnt<<"个1."<<endl;

    cnt=ms.count(1);//关联容器专享   set已经排序能够高速计数
    cout<<"multiset里有"<<cnt<<"个1."<<endl;

    return 0;
}

 

posted @ 2017-07-10 13:20  wzzkaifa  阅读(277)  评论(0编辑  收藏  举报