自己实现绑定器,代码如下
#include <iostream>
#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
#include <ctime>
using namespace std;
template<typename Container>
void printerContainer(Container & _container) {
typename Container::iterator it_begin = _container.begin();
typename Container::iterator it_end = _container.end();
while (it_begin != it_end) {
cout << *it_begin << " ";
++it_begin;
}
}
//compare是 二元函数对象, T 作为 myBind1st函数对象的属性
template<typename compare, typename T>
class myBind1st {
public:
myBind1st<compare,T>(compare _comp, T _val) : comp(_comp), val(_val) {}
//外部调用的时候 传入 T paremeter
bool operator()(T paremeter) {
//使用myBind1st函数对象的属性,和外部传入的参数 调用 二元函数对象
return comp(val, paremeter);
}
private:
compare comp;
T val;
};
//my_find_if 泛型算法,实现查找功能,是一个函数模板, Iterator 迭代器,compare作为函数对象
template<typename Iterator,typename compare>
Iterator my_find_if(Iterator it_begin, Iterator it_end, compare comp) {
for (; it_begin != it_end; ++it_begin) {
if (comp(*it_begin)) {
return it_begin;
}
}
return it_end;
}//end my_find_if
int main() {
vector < int> vec;
srand(time(nullptr));
for (int i = 0; i < 20; i++) {
vec.push_back((rand() % 100 + 1));
}
printerContainer<vector < int>>(vec);
vector< int>::iterator it_begin = vec.begin();
vector< int>::iterator it_end = vec.end();
sort(it_begin, it_end);//默认小到大排序
cout << endl;
printerContainer<vector < int>>(vec);
cout << endl;
//greater二元函数对象
sort(it_begin, it_end, greater<int>());//大到小排序
printerContainer<vector < int>>(vec);
cout << endl;
vector<int>::iterator it_findValue = my_find_if(it_begin, it_end, myBind1st<greater<int>, int>(greater<int>(), 70));
if (it_findValue != it_end) {
vec.insert(it_findValue, 70);
}
printerContainer<vector < int>>(vec);
cout << endl;
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));