发布时间:2022-12-06 文章分类:编程知识 投稿人:李佳 字号: 默认 | | 超大 打印

自己实现绑定器,代码如下

#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));