C++STL 仿函数
C++ 函数 STL
2023-09-11 14:22:29 时间
1. 概述
仿函数(functors)是早期的命名,C++标准规格定案后采用的新名称是函数对象(function objects)(也就是一种具有函数特质的对象)。
仿函数的作用:
在C++的STL提供的各种算法,例如sort()。往往有两个版本,其中一个是最长用的某种运算的版本(operator<);第二个版本则表现出最泛化的演算流程,允许用户“以template参数来指定所需要采取的策略”。
仿函数产生的原因:
由于函数指针毕竟不能满足STL对抽象对象的需求,也不能满足软件积木的需求——函数指针无法和STL其它组件(如配接器adapter)搭配使用,产生更灵活的变化。
2. 编码
2.1 仿函数实现示例
//仿函数1,比较大小
template<typename T> struct comp
{
bool operator()(T in1, T in2) const
{
return (in1>in2);
}
};
comp<int> m_comp_objext;
cout << m_comp_objext(6, 3) << endl; //使用对象调用
cout << comp<int>()(1, 2) << endl; //使用仿函数实现
在上面的代码中,第一种调用方式是使用comp的定义的一个对象,然后通过这个对象来调用操作符(),来实现两个数组的比较的;对于第二个调用comp<int>()(1, 2)是产生一个临时(无名的)对象。
2.2 仿函数详细说明
在下面的使用场景(统计一个容器中的符合规定的元素),将说明之前提到的函数指针为什么不能在STL中替换掉仿函数
bool my_count(int num)
{
return (num < 5);
}
int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
std::vector<int> v_a(a, a+10);
cout << "count: " << std::count_if(v_a.begin(), v_a.end(), my_count);
在上面我们传递进去了一个函数指针作为count_if的比较条件。但是现在根据新的需求,不再统计容器中小于5的变量个数,改为了8或者3。那么最直接的方法就是加一个参数threshold就可以了,就像下面这样
bool my_count(int num, int threshold)
{
return (num < threshold));
}
但是这样的写法STL中是不能使用的,而且当容器中的元素类型发生变化的时候就不能使用了,更要命的是不能使用模板函数。
那么,既然多传递传递参数不能使用,那就把需要传递进来的那个参数设置为全局的变量,那样确实能够实现当前情况下对阈值条件的修改,但是修改起来存在隐患(要是没有初始化就调用怎么办)。因而解决这样问题的方式就是仿函数
template<typename T> struct my_count1
{
my_count1(T a)
{
threshold = a;
}
T threshold;
bool operator()(T num)
{
return (num < threshold);
}
};
int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
std::vector<int> v_a(a, a+10);
cout << "count: " << std::count_if(v_a.begin(), v_a.end(), my_count1<int>(8));
这样的方式就很好的兼容了STL。
相关文章
- C++安全删除指针SAFE_DELETE宏
- 【C++】步步为营之知识点积累
- 【C/C++学院】0814-引用高级、引用高级增加/auto自动变量自动根据类型创建数据/Bool/Enum/newdelete全局/大数据乘法与结构体/函数模板与auto/宽字符本地化/inline
- c++ win32 遍历进程列表
- c++模板学习04之普通函数与模板函数调用规则
- C++11 Lambda表达式简单解析
- lua调用C++函数崩溃时,查看lua的调用栈信息 (特别适用于tolua++)
- 解答私信@被c++折磨头秃的花季美少女 //C++ 编写一个进阶版的进制转换程序,运行功能如下:请选择要输入的数字的进制(2、8、10、16):请输入该数字:请选择要转换成的进制(2、8。。。
- C++回调函数
- C++ find()函数用法详解(超级详细)
- C/C++ 工具函数 —— 大端模式和小端模式的互换
- VC++ 从 CString类型的文件路径中获取文件名和扩展名
- Effective C++:条款25:考虑写出一个不抛异常的swap函数
- C++ 排序函数 sort(),qsort()的使用方法
- 用C设计,用C++编码
- linux 下 c++ clock 函数理解
- c++ 纯虚函数和抽象类那些事(三)
- C++虚函数表原理(六十八)
- Emacs之为c/c++函数生成调用图(八十)
- 拆除vs发展c++程序开发过程中产生的.ipch和.sdf文件的方法
- C++逆向分析——构造函数和析构函数
- 学习 C++,关键是要理解概念,而不应过于深究语言的技术细节
- 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)
- VC++ 多线程同步实例
- C++中虚函数多态实现的原理刨析
- 【C++】第17篇 详解C++中的友元函数 friend
- c++职工管理系统主函数代码
- 学习C++:C++进阶(五)多线程编程原理及多线程编程方法