STL应用 vector & find_if

<STL应用> vector & find_if 

看到有人问有个名为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; 
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值