<STL應用> vector & find_if
應用在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
2.functor
可是這樣要比較值就被寫死了啊!!
沒錯....所以這時候template就派上用場了....
所以我們改寫
如何使用呢??很簡單....
看到有人問有個名為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不熟的往往都會忽略。
- #include <iostream>
- #include <algorithm>
- #include <vector>
- #include <cstdlib>
- using namespace std;
- struct C
- {
- C():v1(0),v2(0){}
- C(const int& val1,const int& val2):v1(val1),v2(val2){}
- C operator()(const int& val1,const int& val2)
- {
- v1=val1;
- v2=val2;
- return *this;
- }
- ~C(){}
- int v1;
- int v2;
- };
- template<int n>
- class CComp{
- public:
- bool operator()(const C& lhs)
- {
- return (lhs.v2==n);
- }
- };
- int main(int argc, char *argv[])
- {
- vector<C> cv;
- C val;
- cv.push_back(val(1,100));
- cv.push_back(val(2,52));
- cv.push_back(val(3,25));
- cv.push_back(val(4,75));
- cv.push_back(val(5,84));
- cv.push_back(val(6,33));
- vector<C>::iterator cviter =
- find_if(cv.begin(),cv.end(),CComp<75>());
- cout<<cviter->v1<<" "<<cviter->v2<<endl;
- cout<<endl;
- system("PAUSE");
- return 0;
- }