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 @   遥望星空  阅读(6812)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2015-08-04 解决Mac OS下安装MyEclipse报错:Your system does not have sufficient memory to support MyEclipse
2015-08-04 Swift iOS 文件操作:沙盒(SandBox)、程序包(NSBundle)
2015-08-04 Swift之沙盒与数据存储
2015-08-04 iOS中bundle的意义
2015-08-04 iOS开发里的Bundle是个啥玩意?!
2014-08-04 城市三维地下管线管理系统
2012-08-04 修复VS 2010的Help Library管理器
点击右上角即可分享
微信分享提示