<二>bind1st和bind2nd的底层实现原理
2023-02-18 16:33:46 时间
自己实现绑定器,代码如下
#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));
相关文章
- Dockers(29)- 网络连通
- Docker系列(28)- 自定义网络
- Docker系列(27)- 容器互联--link
- Docker系列(26)- 发布镜像到阿里云容器服务
- Docker系类(25)- 发布镜像到DockerHub
- Docker系列(24)- 实战:DockerFile制作tomcat镜像
- Docker系列(23)- CMD和ENTRYPOINT的区别
- Docker系列(22)- DockerFile指令说明并构建自己的centos
- Docker系列(21)- DockerFile介绍
- Docker系列(20)- 数据卷容器
- Docker系列(19)- 数据卷之Dockerfile
- Docker系列(18)- 具名挂载和匿名挂载
- Docker系列(17)- MySQL同步数据
- Docker系列(16)- 容器数据卷
- Docker系列(15)- Commit镜像
- Docker系列(13)- 部署es+kibana
- Docker系列(12)- 部署Tomcat
- Docker系列(11)- 部署Nginx
- Docker系列(10)- 常用命令小结
- Docker系列(9)- 常用其他命令(2) | 进入容器和拷贝的命令