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<<"\n1  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
******/


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值