泛型算法_简单模拟实现STL中的find_if

版权声明:私藏源代码是违反人性的罪恶行为!博客转载无需告知,学无止境。 https://blog.csdn.net/qq_41822235/article/details/83514894

目录

一、主要内容

1.1 思路

1.2 predicate

1.3 绑定器

1.4 find_if

1.5 测试


一、主要内容

1.1 思路

泛型算法find_if实现了找出给定区间首个满足特殊条件的元素。(首次大于,首次大于等于,首次小于,首次小于等于)。

关于泛型函数find_if,如果我们是设计者,如何去设计。我们可能会想,给定查找区间以及比较的标杆。约束查找区间可以使用左右边界,还是遵循统一的区间描述的习惯——左闭右开

1.2 predicate

本质是一个函数对象,(编译器优化以后)名称后面直接跟参数列表如图1-2 所示看起来就同函数调用一样,故而有函数对象的说法。图1-1 是正常调用。

图1-2 优化后
图1-1 优化前

template<typename T>
class mless
{
public:
	typedef T value_type1;
	typedef T value_type2;
	typedef bool result_type;
public:
	bool operator()(T a, T b)
	{
		return a < b;
	}
};

核心的地方就是函数调用运算符又称括号运算符重载,实现两个变量之间的值比较。

1.3 绑定器

本绑定器第二个参数在实例化对象的时候就会给定。

template<typename Pre>
class mbind2nd
{
public:
	mbind2nd(Pre pre, typename Pre::value_type2 val2)
		:_pre(pre), _val2(val2){ }
	typename Pre::result_type operator ()(typename Pre::value_type1 val1)
	{
		return _pre(val1, _val2);
	}
private:
	Pre _pre;
	typename Pre::value_type2 _val2;
};

1.4 find_if

template<typename SrcIt, typename Pre>
SrcIt mfind_if(SrcIt first, SrcIt last, Pre pre)
{
	while (first != last)
	{
		if (pre(*first))
			break;
		++first;
	}
	return first;
}

1.5 测试

int main()
{
	vector<int> vec1;
	for (int i = 0; i < 10; ++i)
	{
		vec1.push_back(10 - i);
	}
	//查找第一个小于6的元素
	vector<int>::iterator ite1 = mfind_if(vec1.begin(), vec1.end(), mbind2nd<mless<int>>(mless<int>(), 6));
	if (ite1 == vec1.end())
		cout << "not exit" << endl;
	else
		cout << *ite1 << endl;
	return 0;
}
图2 VS2017下运行结果

猜你喜欢

转载自blog.csdn.net/qq_41822235/article/details/83514894