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 }

 

posted @ 2016-08-04 20:33  遥望星空  阅读(6808)  评论(0编辑  收藏  举报