版权声明:私藏源代码是违反人性的罪恶行为!博客转载无需告知,学无止境。 https://blog.csdn.net/qq_41822235/article/details/83514894
目录
一、主要内容
1.1 思路
泛型算法find_if实现了找出给定区间首个满足特殊条件的元素。(首次大于,首次大于等于,首次小于,首次小于等于)。
关于泛型函数find_if,如果我们是设计者,如何去设计。我们可能会想,给定查找区间以及比较的标杆。约束查找区间可以使用左右边界,还是遵循统一的区间描述的习惯——左闭右开。
1.2 predicate
本质是一个函数对象,(编译器优化以后)名称后面直接跟参数列表如图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;
}