zoukankan      html  css  js  c++  java
  • 实战c++中的vector系列--vector应用之STL的find、find_if、find_end、find_first_of、find_if_not(C++11)

    使用vector容器,即避免不了进行查找,所以今天就罗列一些stl的find算法应用于vector中。

    find()
    Returns an iterator to the first element in the range [first,last) that compares equal to val. If no such element is found, the function returns last.

    #include <iostream>     // std::cout
    #include <algorithm>    // std::find
    #include <vector>       // std::vector
    
    int main () {
      // using std::find with array and pointer:
      int myints[] = { 10, 20, 30, 40 };
      int * p;
    
      p = std::find (myints, myints+4, 30);
      if (p != myints+4)
        std::cout << "Element found in myints: " << *p << '
    ';
      else
        std::cout << "Element not found in myints
    ";
    
      // using std::find with vector and iterator:
      std::vector<int> myvector (myints,myints+4);
      std::vector<int>::iterator it;
    
      it = find (myvector.begin(), myvector.end(), 30);
      if (it != myvector.end())
        std::cout << "Element found in myvector: " << *it << '
    ';
      else
        std::cout << "Element not found in myvector
    ";
    
      return 0;
    }
    //
    30
    30

    find_end()
    Searches the range [first1,last1) for the last occurrence of the sequence defined by [first2,last2), and returns an iterator to its first element, or last1 if no occurrences are found.

    #include <iostream>     // std::cout
    #include <algorithm>    // std::find_end
    #include <vector>       // std::vector
    
    bool myfunction (int i, int j) {
      return (i==j);
    }
    
    int main () {
      int myints[] = {1,2,3,4,5,1,2,3,4,5};
      std::vector<int> haystack (myints,myints+10);
    
      int needle1[] = {1,2,3};
    
      // using default comparison:
      std::vector<int>::iterator it;
      it = std::find_end (haystack.begin(), haystack.end(), needle1, needle1+3);
    
      if (it!=haystack.end())
        std::cout << "needle1 last found at position " << (it-haystack.begin()) << '
    ';
    
      int needle2[] = {4,5,1};
    
      // using predicate comparison:
      it = std::find_end (haystack.begin(), haystack.end(), needle2, needle2+3, myfunction);
    
      if (it!=haystack.end())
        std::cout << "needle2 last found at position " << (it-haystack.begin()) << '
    ';
    
      return 0;
    }
    //输出:
    5
    3

    find_if()
    Returns an iterator to the first element in the range [first,last) for which pred returns true. If no such element is found, the function returns last.

    #include <iostream>     // std::cout
    #include <algorithm>    // std::find_if
    #include <vector>       // std::vector
    
    bool IsOdd (int i) {
      return ((i%2)==1);
    }
    
    int main () {
      std::vector<int> myvector;
    
      myvector.push_back(10);
      myvector.push_back(25);
      myvector.push_back(40);
      myvector.push_back(55);
    
      std::vector<int>::iterator it = std::find_if (myvector.begin(), myvector.end(), IsOdd);
      std::cout << "The first odd value is " << *it << '
    ';
    
      return 0;
    }
    //输出:
    25

    顺便说一句能够使用lambda表达式取代IsOdd函数。使得更加简洁。

    find_first_of()
    Returns an iterator to the first element in the range [first1,last1) that matches any of the elements in [first2,last2). If no such element is found, the function returns last1.

    #include <iostream>     // std::cout
    #include <algorithm>    // std::find_first_of
    #include <vector>       // std::vector
    #include <cctype>       // std::tolower
    
    bool comp_case_insensitive (char c1, char c2) {
      return (std::tolower(c1)==std::tolower(c2));
    }
    
    int main () {
      int mychars[] = {'a','b','c','A','B','C'};
      std::vector<char> haystack (mychars,mychars+6);
      std::vector<char>::iterator it;
    
      int needle[] = {'A','B','C'};
    
      // using default comparison:
      it = find_first_of (haystack.begin(), haystack.end(), needle, needle+3);
    
      if (it!=haystack.end())
        std::cout << "The first match is: " << *it << '
    ';
    
      // using predicate comparison:
      it = find_first_of (haystack.begin(), haystack.end(),
                          needle, needle+3, comp_case_insensitive);
    
      if (it!=haystack.end())
        std::cout << "The first match is: " << *it << '
    ';
    
      return 0;
    }
    输出:
    A
    a

    find_if_not()
    最后出厂这个 我们应该重视一些 是C++11才有的方法。个人认为用处非常多。看看官方的描写叙述:
    Returns an iterator to the first element in the range [first,last) for which pred returns false. If no such element is found, the function returns last.
    样例:

    #include <iostream>     // std::cout
    #include <algorithm>    // std::find_if_not
    #include <array>        // std::array
    
    int main () {
      std::array<int,5> foo = {1,2,3,4,5};
    
      std::array<int,5>::iterator it =
        std::find_if_not (foo.begin(), foo.end(), [](int i){return i%2;} );
      std::cout << "The first even value is " << *it << '
    ';
    
      return 0;
    }
    //输出:
    2

    最后 再来一个程序:

    #include <vector>
    #include <string>
    #include <algorithm> 
    struct value_t
    {
      int a;
       int b;
    };
    
    class vector_finder
    {
    public:
    vector_finder(const int a) :m_i_a(a) {}
    bool operator ()(const std::vector<struct value_t>::value_type &value)
    {
            return value.a == m_i_a;
    }
    private:
           int m_i_a;
    };
    
    
    int main()
    {
                std::vector<struct value_t> my_vector;
                struct value_t my_value;
    
                    my_value.a = 11; my_value.b = 1000;
                my_vector.push_back(my_value);
    
                    my_value.a = 12; my_value.b = 1000;
                my_vector.push_back(my_value);
    
                    my_value.a = 13; my_value.b = 1000;
                my_vector.push_back(my_value);
    
                    my_value.a = 14; my_value.b = 1000;
                my_vector.push_back(my_value);
    
                    std::vector<struct value_t>::iterator it = my_vector.end();
                it = std::find_if(my_vector.begin(), my_vector.end(), vector_finder(13));
                if (it == my_vector.end())
                       printf("not found
    ");
                else
                       printf("found value.a:%d value.b:%d
    ", it->a, it->b);
                return 0;
            }

    最后来一个实战中用到的。vector<string>中的string的首字母依照字母表进行排序:

    #include <iostream>     // std::cout
    #include <algorithm>    // std::stable_sort
    #include <vector>       // std::vector
    #include <string>
    
    static char ch = 'a';
    bool myfunction(const std::string& lhs, const std::string& rhs)
    {
        return lhs < rhs;
    }
    
    bool myfunction2(const std::string& lhs)
    {
        return lhs[0] == ch;
    }
    
    int main() {
    
        std::vector<std::string> myvector;
        myvector.push_back("wo");
        myvector.push_back("wi");
        myvector.push_back("wa");
        myvector.push_back("ao");
        myvector.push_back("bo");
        myvector.push_back("ae");
        myvector.push_back("bv");
        myvector.push_back("cd");
        myvector.push_back("ef");
        myvector.push_back("gd");
        myvector.push_back("ww");
        myvector.push_back("cd");
        myvector.push_back("at");
        myvector.push_back("bt");
        myvector.push_back("ct");
        myvector.push_back("dt");
        myvector.push_back("et");
        myvector.push_back("ft");
        myvector.push_back("gt");
        myvector.push_back("ht");
        myvector.push_back("it");
        myvector.push_back("jt");
        myvector.push_back("kt");
        myvector.push_back("lt");
        myvector.push_back("mt");
        myvector.push_back("nt");
        myvector.push_back("ot");
        myvector.push_back("pt");
    
        myvector.push_back("qt");
        myvector.push_back("rt");
        myvector.push_back("st");
        myvector.push_back("tt");
        myvector.push_back("ut");
        myvector.push_back("vt");
        myvector.push_back("wt");
        myvector.push_back("xt");
        //myvector.push_back("yt");
        myvector.push_back("zt");
    
        myvector.push_back("qt");
        myvector.push_back("et");
        myvector.push_back("ee");
    
    
        std::stable_sort(myvector.begin(), myvector.end(), myfunction);
    
        for (std::string &s : myvector)
            std::cout << s << " ";
        std::cout << std::endl;
        std::cout << "===============" << std::endl;
    
    
        for (int i = 1;i < 27; i++)
        {
            auto  it_begin = std::find_if(myvector.begin(), myvector.end(), myfunction2);
            auto  it_end = std::find_if_not(it_begin, myvector.end(), myfunction2);
            for (auto i = it_begin; i != it_end; i++)
            {
                std::cout << *i << " ";
            }
            std::cout << std::endl;
    
            ch++;
        }   
        return 0;
    }
    //输出:
    ae ao at bo bt bv cd cd ct dt ee ef et et ft gd gt ht it jt kt lt mt nt ot pt qt qt rt st tt ut vt wa wi wo wt ww xt zt 
    ===============
    ae ao at
    bo bt bv
    cd cd ct
    dt
    ee ef et et
    ft
    gd gt
    ht
    it
    jt
    kt
    lt
    mt
    nt
    ot
    pt
    qt qt
    rt
    st
    tt
    ut
    vt
    wa wi wo wt ww
    xt
    
    zt
    
    
    
    
  • 相关阅读:
    Pig与Hive的区别
    Hadoop MapReduceV2(Yarn) 框架简介
    Spark技术内幕:Client,Master和Worker 通信源码解析
    Spark技术内幕:Stage划分及提交源码分析
    无责任比较thrift vs protocol buffers
    理解hadoop的Map-Reduce数据流(data flow)
    hadoop-2.5安装与配置
    linux下查看本地程序占用的端口
    MFC安装与部署(程序打包)
    关系数据库设计中数据字典设计例子
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7101362.html
Copyright © 2011-2022 走看看