您的位置:首页 > 其它

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

2017-06-14 09:31 525 查看

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
******/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: