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. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值