bindto(bind1st和bind2nd的底层实现原理)
导读:自己实现绑定器,代码如下 #include...
自己实现绑定器,代码如下
#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));
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!