<二>bind1st和bind2nd的底层实现原理
自己实现绑定器,代码如下
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <functional>
#include <ctime>
using namespace std;
template<typename Container>
void printContainter(Container _container) {
typename Container::iterator it_begin = _container.begin();
typename Container::iterator it_end = _container.end();
for (; it_begin != it_end; ++it_begin) {
cout << *it_begin << " ";
}
cout << endl;
}
//将二元函数对象分装,返回一元函数对象
template<typename Pr, typename T>
class MyBindList2 {
public:
MyBindList2<Pr,T>(Pr _pr, T _val):_mPr(_pr),_mVal(_val) {}
bool operator()(T _paremeter) {
return _mPr(_mVal, _paremeter);
}
private:
Pr _mPr;
T _mVal;
};
//Iterator 迭代器
//Pr 一元函数对象
template<typename Iterator , typename Pr>
Iterator my_find_if_v2(Iterator it_begin, Iterator it_end, Pr _pre) {
for (; it_begin != it_end; ++it_begin) {
if (_pre(*it_begin)) { return it_begin; }
}
return it_end;
}
int main() {
vector<int> v1;
srand(time(nullptr));
for (int i = 0; i < 10; i++) {
v1.push_back((rand() % 100 + 1));
}
printContainter<vector<int>>(v1);
//升序
sort(v1.begin(), v1.end(), less<int>());
//sort(v1.begin(), v1.end(), greater<int>()); 降序
printContainter<vector<int>>(v1);
/* 找到第一个大于40数字前插入40 */
// 方法 一
#if 0
vector<int>::iterator it_begin = v1.begin();
vector<int>::iterator it_end = v1.end();
for (; it_begin!=it_end; ++it_begin) {
if (*it_begin > 40) { break ;}
}
if (it_begin != it_end) {
v1.insert(it_begin,40);
}
printContainter<vector<int>>(v1);
#endif
// 方法 二 自己实现Bind1st
#if 0 自己实现Bind1st
vector<int>::iterator it_find = my_find_if_v2<vector<int>::iterator, MyBindList2<less<int>, int>>(v1.begin(), v1.end(), MyBindList2<less<int>, int>(less<int>(), 40));
v1.insert(it_find, 40);
printContainter<vector<int>>(v1);
#endif
// 方法 三 调用库的Bind1st
vector<int>::iterator find_it2=find_if<vector<int>::iterator, binder1st<less<int>>>(v1.begin(), v1.end(), bind1st<less<int>, int>(less<int>(), 40));
v1.insert(find_it2, 40);
printContainter<vector<int>>(v1);
system("pause");
return 0;
}
上面代码自己实现泛型算法my_find_if,用于找到容器中指定的位置,插入元素
my_find_if 是一个函数模板,参数1,参数2是两个迭代器指向起始和结束位置,在这两个迭代器之间进行遍历,
遍历是否满足的条件由第三个参数决定,第三个参数是一个一元函数对象,由于STL现成提供的greater,less都是
二元函数对象,所以我们自己需要实现一元函数对象,这个一元函数对象通过提供的二元函数对象和参数进行封装,封装后
就是myBind1st,myBind1st底层 operator()(parameter1) 中实际调用的函数二元函数对象的operator()( parameter1 ,parameter2)
vector<int>::iterator it_findValue = my_find_if(it_begin, it_end, myBind1st<greater<int>, int>(greater<int>(), 70));