看到有人問有個名為C的struct如下
code:
struct C
{
int v1;
int v2;
};
應用在vector中式宣告成vector
如果要搜尋內部元素時該怎麼做??
一般解法通常是用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 }
原文链接: https://www.cnblogs.com/zjoch/p/5738300.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/238098
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!