常用STL算法2_查找

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <set>
#include <list>
#include <algorithm>
#include <functional>
#include <string>
#include <iterator> //輸出流
using namespace std;

//謂詞1
bool FindEquelNum1(int &num1, int &num2)
{
    return (num1 == num2)?true:false;
}
//謂詞2
struct FindEquelNum2
{
public:
    FindEquelNum2(int n)
    {
        m_num = n;
    }
    bool operator()(int &num1, int &num2)
    {
        if ((num1 == num2) && (num1 == m_num))
            return true;
        else
            return false;
    }
private:
    int m_num;
};

void main071_adjacent_find()
{
    vector<int> vecInt;
    vecInt.push_back(1);
    vecInt.push_back(2);
    vecInt.push_back(2);
    vecInt.push_back(4);
    vecInt.push_back(5);
    vecInt.push_back(5);
    //1. adjacent_find: find first matching successor
    //vector<int>::iterator it = adjacent_find(vecInt.begin(), vecInt.end());//默認找第一個 ok
    //vector<int>::iterator it = adjacent_find(vecInt.begin(), vecInt.end(),FindEquelNum1);////謂詞1 ok
    //2. find first satisfying _Pred with successor
    vector<int>::iterator it = adjacent_find(vecInt.begin(), vecInt.end(), FindEquelNum2(5));//找到滿足條件的第一個//謂詞2 ok
    if (it == vecInt.end())
    {
        cout<<"not find"<<endl;
    }
    else
    {
        cout<<"找到的值爲:"<<*it<<endl;
        int dis = distance(vecInt.begin(), it);
        cout<<"distance:"<<dis<<endl;
    }
}
//二分法
void main072_binary_search()
{
    set<int> setInt;
    setInt.insert(3);
    setInt.insert(1);
    setInt.insert(7);
    setInt.insert(5);
    setInt.insert(9);
    /*
    bool binary_search(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
    {   
        // test if _Val equivalent to some element, using operator<
        _First = _STD lower_bound(_First, _Last, _Val);
        return (_First != _Last && !(_Val < *_First));
    }
    */
    bool bFind = binary_search(setInt.begin(),setInt.end(),5);
    if (bFind)
    {
        cout<<"binary_search succ"<<endl;
    }
    else
    {
        cout<<"binary_search fail"<<endl;
    }

}
//利用等於操作符,把標誌範圍內的元素與輸入值比較,返回相等的個數
void main073_count()
{
    vector<int> vecInt;
    vecInt.push_back(1);
    vecInt.push_back(2);
    vecInt.push_back(2);
    vecInt.push_back(4);
    vecInt.push_back(5);
    vecInt.push_back(5);

    /*
    count(_InIt _First, _InIt _Last, const _Ty& _Val)
    {   
        // count elements that match _Val
        _DEBUG_RANGE(_First, _Last);
        return (_Count_np(_Unchecked(_First), _Unchecked(_Last), _Val));
    }
    typename iterator_traits<_InIt>::difference_type
    _Count_np(_InIt _First, _InIt _Last, const _Ty& _Val)
    {   
        // count elements that match _Val
        typename iterator_traits<_InIt>::difference_type _Count = 0;

        for (; _First != _Last; ++_First)
            if (*_First == _Val)
                ++_Count;
        return (_Count);
    }

    */
    int num = count(vecInt.begin(), vecInt.end(), 5);
    cout<<"num:"<<num<<endl;

}

bool GreatNum(int &num)
{
    return (num > 3);
}

void main074_count_if()
{
    vector<int> vecInt;
    vecInt.push_back(1);
    vecInt.push_back(2);
    vecInt.push_back(2);
    vecInt.push_back(4);
    vecInt.push_back(5);
    vecInt.push_back(5);
    /*
    typename iterator_traits<_InIt>::difference_type
    count_if(_InIt _First, _InIt _Last, _Pr _Pred)
    {   
        // count elements satisfying _Pred
        _DEBUG_RANGE(_First, _Last);
        _DEBUG_POINTER(_Pred);
        return (_Count_if(_Unchecked(_First), _Unchecked(_Last), _Pred));
    }
    */
    int num = count_if(vecInt.begin(), vecInt.end(), GreatNum);
    cout<<"num:"<<num<<endl;
}

void main075_find()
{
    vector<int> vecInt;
    vecInt.push_back(1);
    vecInt.push_back(3);
    vecInt.push_back(5);
    vecInt.push_back(7);
    vecInt.push_back(9);
    /*
    _InIt find(_InIt _First, _InIt _Last, const _Ty& _Val)
    {   
        // find first matching _Val
        _DEBUG_RANGE(_First, _Last);
        return (_Rechecked(_First, _Find(_Unchecked(_First), _Unchecked(_Last), _Val)));
    }
    */
    vector<int>::iterator it = find(vecInt.begin(), vecInt.end(), 5);
    cout<<*it<<endl;

    int dis = distance(vecInt.begin(), it);
    cout<<"dis:"<<dis<<endl;

}

void main076_find_if()
{
    vector<int> vecInt;
    vecInt.push_back(1);
    vecInt.push_back(3);
    vecInt.push_back(5);
    vecInt.push_back(7);
    vecInt.push_back(9);
    /*
    _InIt find_if(_InIt _First, _InIt _Last, _Pr _Pred)
    {   
        // find first satisfying _Pred
        _DEBUG_RANGE(_First, _Last);
        _DEBUG_POINTER(_Pred);
        return (_Rechecked(_First, _Find_if(_Unchecked(_First), _Unchecked(_Last), _Pred)));
    }
    */

    vector<int>::iterator it = find_if(vecInt.begin(), vecInt.end(), GreatNum);
    cout<<*it<<endl;

    int dis = distance(vecInt.begin(), it);
    cout<<"dis:"<<dis<<endl;

    cout<<"******找出大於3的元素及個數********"<<endl;
    vector<int>::iterator it2 = vecInt.begin();
    int total_cnt = 0;
    int dis2 = 0;
    for (;it2 != vecInt.end(); it2++)
    {
        it2 = find_if(it2, vecInt.end(), GreatNum);
        dis = distance(vecInt.begin(), it2);
        cout<<"location:"<<dis<<"  elem:"<<*it2<<endl;
        total_cnt++;
    }
    cout<<"total_cnt:"<<total_cnt<<endl;
}


int main()
{
    //main071_adjacent_find();
    //main072_binary_search();
    //main073_count();
    //main074_count_if();
    //main075_find();
    main076_find_if();
    cout<<"\nhello"<<endl;
    system("pause");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章