您的位置:首页 > 编程语言 > C语言/C++

C++ STL 算法精选之查找篇

2013-08-19 16:56 267 查看
1.查找类算法
adjacent_find(first,last);

查找区间[first,last)内第一次出现连续的两个相等的元素,并返回指向第一个元素的迭代器,连续元素之间的比较,默认是==

adjacent_find(first,last,pred);

用途如上,但是元素之间的比较是通过函数pred来完成,pred接受两个容器内元素类型的元素,返回bool值

函数原型:

template <class ForwardIterator>

   ForwardIterator adjacent_find ( ForwardIterator first, ForwardIterator last )

{

  ForwardIterator next=first; ++next;

  if (first != last)

    while (next != last)

      if (*first++ == *next++)  // or: if (pred(*first++,*next++)), for the pred version

        return first;

  return last;

}

 例子:

// adjacent_find example

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

bool myfunction (int i, int j) {

  return (i==j);

}

int main () {

  int myints[] = {10,20,30,30,20,10,10,20};

  vector<int> myvector (myints,myints+8);

  vector<int>::iterator it;

  // using default comparison:

  it = adjacent_find (myvector.begin(), myvector.end());

  if (it!=myvector.end())

    cout << "the first consecutive repeated elements are: " << *it << endl;

  //using predicate comparison:

  it = adjacent_find (++it, myvector.end(), myfunction);

  if (it!=myvector.end())

    cout << "the second consecutive repeated elements are: " << *it << endl;

 

  return 0;

}

 

Output:

the first consecutive repeated elements are: 30

the second consecutive repeated elements are: 10

 find(first,last,value);

 查找区间[first,last)之间内值为value的元素,返回迭代器类型,若没找到,则返回迭代器末尾end 函数原型:

 template<class InputIterator, class T>

  InputIterator find ( InputIterator first, InputIterator last, const T& value )

  {

    for ( ;first!=last; first++) if ( *first==value ) break;

    return first;

  }

例子:// find example

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

int main () {

  int myints[] = { 10, 20, 30 ,40 };

  int * p;

  // pointer to array element:

  p = find(myints,myints+4,30);

  ++p;

  cout << "The element following 30 is " << *p << endl;

  vector<int> myvector (myints,myints+4);

  vector<int>::iterator it;

  // iterator to vector element:

  it = find (myvector.begin(), myvector.end(), 30);

  ++it;

  cout << "The element following 30 is " << *it << endl;

  return 0;

}

 

Output:

The element following 30 is 40

The element following 30 is 40

find_if(first,last,pred);

返回区间[first,last)内第一个使pred函数返回为真的元素的迭代器,否则返回last注意:pred接受一个参数函数原型:

template<class InputIterator, class Predicate>

  InputIterator find_if ( InputIterator first, InputIterator last, Predicate pred )

  {

    for ( ; first!=last ; first++ ) if ( pred(*first) ) break;

    return first;

  }

例子:// find_if example

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

bool IsOdd (int i) {

  return ((i%2)==1);

}

int main () {

  vector<int> myvector;

  vector<int>::iterator it;

  myvector.push_back(10);

  myvector.push_back(25);

  myvector.push_back(40);

  myvector.push_back(55);

  it = find_if (myvector.begin(), myvector.end(), IsOdd);

  cout << "The first odd value is " << *it << endl;

  return 0;

}

 

Output:

The first odd value is 25

 

find_first_of(first1,last1,first2,last2);

find_first_of(first1,last1,first2,last2,pred);

返回一个迭代器,使得[first2,last2)之中任意一个元素第一次出现在区间[first1,last1)中。

默认比较为==,当然也可以自己定义pred函数(接受2个参数),返回bool型 函数原型:

template<class ForwardIterator1, class ForwardIterator2>

  ForwardIterator1 find_first_of ( ForwardIterator1 first1, ForwardIterator1 last1,

                                   ForwardIterator2 first2, ForwardIterator2 last2)

{

  for ( ; first1 != last1; ++first1 )

    for (ForwardIterator2 it=first2; it!=last2; ++it)

      if (*it==*first1)          // or: if (comp(*it,*first)) for the pred version

        return first1;

  return last1;

}

例子:// find_first_of example

#include <iostream>

#include <algorithm>

#include <cctype>

#include <vector>

using namespace std;

bool comp_case_insensitive (char c1, char c2) {

  return (tolower(c1)==tolower(c2));

}

int main () {

  int mychars[] = {'a','b','c','A','B','C'};

  vector<char> myvector (mychars,mychars+6);

  vector<char>::iterator it;

  int match[] = {'A','B','C'};

  // using default comparison:

  it = find_first_of (myvector.begin(), myvector.end(), match, match+3);

  if (it!=myvector.end())

    cout << "first match is: " << *it << endl;

  // using predicate comparison:

  it = find_first_of (myvector.begin(), myvector.end(),

                      match, match+3, comp_case_insensitive);

  if (it!=myvector.end())

    cout << "first match is: " << *it << endl;

 

  return 0;

}

 

Output:

First match is: A

First match is: a

 

find_end(first1,last1,first2,last2);

find_end(first1,last1,first2,last2,pred);

返回一个元素迭代器,使得在区间[first1,last1)中最后一次出现[fiest2,last2),

默认比较为==,当然也可以写自己的比较函数pred,接受两个参数,返回bool值函数原型:

template<class ForwardIterator1, class ForwardIterator2>

  ForwardIterator1 find_end ( ForwardIterator1 first1, ForwardIterator1 last1,

                              ForwardIterator2 first2, ForwardIterator2 last2)

{

  ForwardIterator1 it1, limit, ret;

  ForwardIterator2 it2;

  limit=first1; advance(limit,1+distance(first1,last1)-distance(first2,last2));

  ret=last1;

  while (first1!=limit)

  {

    it1 = first1; it2 = first2;

    while (*it1==*it2)          // or: while (pred(*it1,*it2)) for the pred version

      { ++it1; ++it2; if (it2==last2) {ret=first1;break;} }

    ++first1;

  }

  return ret;

}

例子:// find_end example

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

bool myfunction (int i, int j) {

  return (i==j);

}

int main () {

  int myints[] = {1,2,3,4,5,1,2,3,4,5};

  vector<int> myvector (myints,myints+10);

  vector<int>::iterator it;

  int match1[] = {1,2,3};

  // using default comparison:

  it = find_end (myvector.begin(), myvector.end(), match1, match1+3);

  if (it!=myvector.end())

    cout << "match1 last found at position " << int(it-myvector.begin()) << endl;

  int match2[] = {4,5,1};

  // using predicate comparison:

  it = find_end (myvector.begin(), myvector.end(), match2, match2+3, myfunction);

  if (it!=myvector.end())

    cout << "match2 last found at position " << int(it-myvector.begin()) << endl;

 

  return 0;

}

 

Output:

Match found at position 5

Match found at position 3

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