zoukankan      html  css  js  c++  java
  • C++ STL 算法精选之查找篇


    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
      

  • 相关阅读:
    子网掩码
    子网
    ARP
    IPv6
    Host-Only(仅主机模式)
    NAT(地址转换模式)
    Bridged(桥接模式)
    VMware配置网络/Linux
    three months timestamp
    spring cloud禁止输出日志:ConfigClusterResolver : Resolving eureka endpoints via configuration
  • 原文地址:https://www.cnblogs.com/ainima/p/6331270.html
Copyright © 2011-2022 走看看