<STL应用> vector & find_if
应用在vector中,应声明成
如果要搜寻內部元素時该怎么做?
一般解法通常是用for()循环作线性搜寻,其实这样蛮直接也蛮简单的。
但是这里提供另一种简易解法 find_if()
find_if()的第三个参数提供判断式的传入,但是很可惜,只能传入一个参数。 而且传入的是 *iterator 的类别,而非比对样本值。
例如这个cv里的字段的v1,v2依序为
可是这样要比较值就被写死了啊!
没错,所以这时候template就派上用场了。
所以我们改为
如何使用呢? 很简单
则cviter就是传回cv中C型別字段的v2值为75的位置。
很简单的小应用,也没啥大学问。但是对STL不熟的往往都会忽略。
看到有人问有个名为C的struct如下
struct C {
int v1;
int v2;
};
应用在vector中,应声明成
vector<C> cv;
如果要搜寻內部元素時该怎么做?
一般解法通常是用for()循环作线性搜寻,其实这样蛮直接也蛮简单的。
但是这里提供另一种简易解法 find_if()
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
bool Cfind75(const C& obj) {
return obj.v2==75;
}
2.functor
class Cfind75 {
public:
bool operator()(const C& obj) {
return obj.v2 == 75;
}
};
可是这样要比较值就被写死了啊!
没错,所以这时候template就派上用场了。
所以我们改为
template<int n>
class CComp {
public:
bool operator()(const C& lhs) {
return (lhs.v2 == n);
}
};
如何使用呢? 很简单
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() {
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;
return 0;
}