zoukankan      html  css  js  c++  java
  • C++中的vector&find_if

     <STL應用> vector & find_if

    看到有人問有個名為C的struct如下 

    code:

    struct C
    {
       int v1;
       int v2;
    };



    應用在vector中式宣告成vector<C> cv; 

    如果要搜尋內部元素時該怎麼做?? 
    一般解法通常是用for()迴圈作線行搜尋,其實這樣滿直覺也滿簡單的。 

    這裡提供另一種簡易解法.... 
    find_if()的第三個參數提供判斷式的傳入,但是很可惜,只能傳入一個參數。 
    而且傳入的是*iterator的型別,而非比對樣本值。 

    例如這個cv裡的物件的v1,v2依序為 
    v1 v2 
    1 100 
    2 52 
    3 25 
    4 75 
    5 84 
    6 33 

    那我們要找v2=75時的物件該如何做? 
    1.functor point 
    code:

    bool Cfind75(const C& obj)
    {
            return obj.v2==75;
    }



    2.functor 
    code:

    class Cfind75{
           public:
              bool operator()(const C& obj)
              {
                   return obj.v2==75;
              }
    };



    可是這樣要比較值就被寫死了啊!! 
    沒錯....所以這時候template就派上用場了.... 
    所以我們改寫 
    code:

    template<int n>
    class CComp{
        public:
            bool operator()(const C& lhs)
            {
                return (lhs.v2==n);
            }
    };



    如何使用呢??很簡單.... 
    code:

    vector<C>::iterator cviter = 
            find_if(cv.begin(),cv.end(),CComp<75>());


    則cviter就是傳回cv中C型別物件的v2值為75的位置。 
    -- 
    很簡單的小應用,也沒啥大學問。但是對STL不熟的往往都會忽略。

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <vector>
     4 #include <cstdlib>
     5 using namespace std;
     6 struct C
     7 {
     8    C():v1(0),v2(0){}
     9    C(const int& val1,const int& val2):v1(val1),v2(val2){}
    10    C operator()(const int& val1,const int& val2)
    11    {
    12       v1=val1;
    13       v2=val2;
    14       return *this;
    15    }
    16    ~C(){}
    17    int v1;
    18    int v2;
    19 };
    20 template<int n>
    21 class CComp{
    22     public:
    23         bool operator()(const C& lhs)
    24         {
    25             return (lhs.v2==n);
    26         }
    27 };
    28 int main(int argc, char *argv[])
    29 {
    30     vector<C> cv;
    31     C val;
    32     cv.push_back(val(1,100));
    33     cv.push_back(val(2,52));
    34     cv.push_back(val(3,25));
    35     cv.push_back(val(4,75));
    36     cv.push_back(val(5,84));
    37     cv.push_back(val(6,33));
    38     
    39     vector<C>::iterator cviter = 
    40         find_if(cv.begin(),cv.end(),CComp<75>());
    41     cout<<cviter->v1<<"  "<<cviter->v2<<endl;
    42     cout<<endl;
    43     
    44     system("PAUSE");    
    45     return 0;
    46 }
  • 相关阅读:
    IntelliJ IDEA 中自定义模板代码的缩写
    小猪评《101次求婚》——屌丝是否能够逆袭女神
    C#委托的理解
    ASP.NET MVC权限验证
    ASP.NET MVC 中表单的Encode及Decode
    JQuery方式验证表单和AJAX提交
    C# LIST 的各种加减
    小猪决定做一件尝试
    ASP.NET 将excel导入 sql server
    从客户端XXX中检测到有潜在危险的 Request.Form值——终极解决方案
  • 原文地址:https://www.cnblogs.com/zjoch/p/5738300.html
Copyright © 2011-2022 走看看