• STL_算法_查找算法(search、find_end)


    C++ Primer 学习中。

    。。

     

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


    search          //从左往右找第一个符合条件的子区间    全部容器适用


    find_end  //从右往左找第一个符合条件的子区间    全部容器适用


    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<list>
    #include<deque>
    #include<algorithm>
    using namespace std;
    /*************************************************************************************
    std::search       从左往右找子区间    全部容器适用                       algorithm
    --------------------------------------------------------------------------------------
    template <class ForwardIterator1, class ForwardIterator2>
    ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1,
                              ForwardIterator2 first2, ForwardIterator2 last2 );
    
    template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
    ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1,
                              ForwardIterator2 first2, ForwardIterator2 last2.
                              BinaryPredicate pred );
    
    eg:
    template<class ForwardIterator1, class ForwardIterator2>
    ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1,
                              ForwardIterator2 first2, ForwardIterator2 last2)
    {
        if (first2==last2) return first1;  // specified in C++11
    
        while (first1!=last1)
        {
            ForwardIterator1 it1 = first1;
            ForwardIterator2 it2 = first2;
            while (*it1==*it2)      // or: while (pred(*it1,*it2)) for the pred version
            {
                ++it1;
                ++it2;
                if (it2==last2) return first1;
                if (it1==last1) return last1;
            }
            ++first1;
        }
        return last1;
    }
    **************************************************************************************/
    
    /*************************************************************************************
    std::find_end       从右往左找子区间     全部容器适用                     algorithm
    --------------------------------------------------------------------------------------
    template <class ForwardIterator1, class ForwardIterator2>
    ForwardIterator1 find_end ( ForwardIterator1 first1, ForwardIterator1 last1,
                                ForwardIterator2 first2, ForwardIterator2 last2 );
    
    template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
    ForwardIterator1 find_end ( ForwardIterator1 first1, ForwardIterator1 last1,
                                ForwardIterator2 first2, ForwardIterator2 last2,
                                BinaryPredicate pred );
    
    eg:
    template<class ForwardIterator1, class ForwardIterator2>
    ForwardIterator1 find_end ( ForwardIterator1 first1, ForwardIterator1 last1,
                                ForwardIterator2 first2, ForwardIterator2 last2)
    {
        if (first2==last2) return last1;  // specified in C++11
    
        ForwardIterator1 ret = last1;
    
        while (first1!=last1)
        {
            ForwardIterator1 it1 = first1;
            ForwardIterator2 it2 = first2;
            while (*it1==*it2)      // or: while (pred(*it1,*it2)) for the pred version
            {
                ++it1;
                ++it2;
                if (it2==last2)
                {
                    ret=first1;
                    break;
                }
                if (it1==last1) return ret;
            }
            ++first1;
        }
        return ret;
    }
    **************************************************************************************/
    
    bool mypredicate (int i, int j)
    {
        return (i==j);
    }
    bool myfunction (int i, int j)
    {
        return (i==j);
    }
    bool check(int elem,bool bo)//二元谓词
    {
        if(bo) return !(elem&1);
        else   return  elem&1;
    }
    
    int main ()
    {
        vector<int> myvector;
        vector<int>::iterator it;
    
        // set some values:        myvector: 10 20 30 40 50 60 70 80 90
        for (int i=1; i<10; i++) myvector.push_back(i*10);
    
    
        // using default comparison:
        int match1[] = {40,50,60,70};
    
        it = search (myvector.begin(), myvector.end(), match1, match1+4);
    
        if (it!=myvector.end())
            cout << "match1 found at position " << int(it-myvector.begin()) << endl;
        else
            cout << "match1 not found" << endl;
    
        // using predicate comparison:
        int match2[] = {20,30,50};
        it = search (myvector.begin(), myvector.end(), match2, match2+3, mypredicate);
    
        if (it!=myvector.end())
            cout << "match2 found at position " << int(it-myvector.begin()) << endl;
        else
            cout << "match2 not found" << endl;
        /**--------------------------------------find_end-----------------------------------------**/
    
        int myints[] = {1,2,3,4,5,1,2,3,4,5,1};
        deque<int> mydeque (myints,myints+11);
        deque<int>::iterator itd;
    
        int match3[] = {1,2,3};
    
        // using default comparison:
        itd = find_end (mydeque.begin(), mydeque.end(), match3, match3+3);
    
        if (itd!=mydeque.end())
            cout << "match1 last found at position " << int(itd-mydeque.begin()) << endl;
    
        int match4[] = {4,5,1};
    
        // using predicate comparison:
        itd = find_end (mydeque.begin(), mydeque.end(), match4, match4+3, myfunction);
    
        if (itd!=mydeque.end())
            cout << "match2 last found at position " << int(itd-mydeque.begin()) << endl;
    
        /**--------------------------拓展找:偶数奇数奇数------------------------------**/
    
        cout<<"
    1  2  3  4  5  1  2  3  4  5  1"<<endl;
        vector<int> vec(myints,myints+11);
        bool checkEven[3]={true,false,false};
        //search
        it=search(vec.begin(),vec.end(),checkEven,checkEven+3,check);
        //find_end
        itd=find_end(mydeque.begin(),mydeque.end(),checkEven,checkEven+3,check);
    
        if (it!=vec.end())
            cout << " even odd odd found at position " << int(it-vec.begin()) << endl;
        else
            cout << "not found" << endl;
    
        if (itd!=mydeque.end())
            cout << " even odd odd found at position " << int(itd-mydeque.begin()) << endl;
        else
            cout << "not found" << endl;
        return 0;
    }
    
    /******
    Output:
        match1 found at position 3
        match2 not found
        match1 last found at position 5
        match2 last found at position 3
        
        1  2  3  4  5  1  2  3  4  5  1
         even odd odd found at position 3
         even odd odd found at position 8
    ******/
    


  • 相关阅读:
    链式二叉树遍历具体程序
    非线性结构
    函数调用
    递归
    队列的操作
    MFC多线程详细讲解(转)
    PreTranslateMessage()函数捕获键盘按键消息
    vc和halcon数据的相互赋值
    VC6.0加载lib文件的三种方法
    MFC中按钮控件的用法笔记(转)
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7007182.html
Copyright © 2020-2023  润新知