find函数学习与应用

// find_Function.cpp : 定义控制台应用程序的入口点。
//VS 2005

#include "stdafx.h"
#include <vector>
#include <string>
#include <iostream>

using namespace std;

//find 函数
template<class In, class T>
In MyFind(In first, In last, const T& v)		//标准
{
	while(first != last && *first != v) ++first;
	return first;
}

//然而,在传first、last参数时,容易犯错,比如:传不同的容器对象的指针
//于是又了下列的扩充版本

template<class In>
struct Iseq : public pair<In,In>
{
	//Iseq(In i1, In i2) : first(i1),second(i2){}	//此语句编译不过
	Iseq(In i1, In i2) :pair<In,In>(i1,i2)
	{

	}
};

template<class In, class T>
In MyFind(Iseq<In> r, const T& v)				//扩充
{
	return MyFind(r.first,r.second,v);
}

//上面的扩充版本写法更复杂,于是有了下面的版本
template <class T>
Iseq<typename T::iterator> iseq(/*const*/ T& t)		//不能用const, 带const与不带const算是不同的函数(重载),标准库的实现一般都const版和非const版
{
	//return Iseq(t.begin(),t.end()); //写法错误   Iseq<typename T::iterator> 才是类型
	return Iseq<typename T::iterator>(t.begin(), t.end());
}

int _tmain(int argc, _TCHAR* argv[])
{
	vector<string> strVec;
	strVec.push_back("shenzhen");
	strVec.push_back("guangzhou");
	strVec.push_back("shanghai");
	strVec.push_back("beijing");

	typedef vector<string>::const_iterator CONST_ITERATOR;
	CONST_ITERATOR cItor;


	//标准版
	cItor = MyFind(strVec.begin(),strVec.end(),"shanghai");			
	if(cItor != strVec.end())
		cout << "find shanghai" << endl;
	else
		cout << "cannot find shanghai" << endl;

	//这样写比标准版的MyFind更麻烦,于是又有了另一个版本
	cItor = MyFind(Iseq<CONST_ITERATOR>(strVec.begin(),strVec.end()),"guangzhou");	
	if(cItor != strVec.end())
		cout << "find guangzhou" << endl;
	else
		cout << "cannot find guangzhou" << endl;

	//精简版
	cItor = MyFind(iseq(strVec),"shenzhen");			
	if(cItor != strVec.end())
		cout << "find shenzhen" << endl;
	else
		cout << "cannot find shenzhen" << endl;

	
	system("pause");
	return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值