c/c++ 重载运算符 函数调用运算符
重载运算符 函数调用运算符
把一个类的对象a,当成函数来使用,比如a(),所以需要重载operator()方法。重载了函数调用运算符的类的对象,就是函数对象了。
还有什么是函数对象呢???
- lambda是函数对象
- std::bind函数的返回值是函数对象
- 函数是函数对象
- 函数指针是函数对象
那函数对象是做什么用的呢???
- 在标准算法中使用,比如std::sort(b, e, 函数对象);
标准库提供了下面的函数对象,它们都是模板形式的,它们放在functional头文件中
| 算术 | 关系 | 逻辑 |
|---|---|---|
| plus<Type> | equal_to<Type> | logical_and<Type> |
| minus<Type> | not_equal_to<Type> | logical_or<Type> |
| multiplies<Type> | greater<Type> | logical_not<Type> |
| divides<Type> | greater_equal<Type> | |
| modulus<Type> | less<Type> | |
| negate<Type> | less_equal<Type> |
例子:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <functional>
class LineStr{
public:
LineStr(std::istream& in = std::cin) : is(in){}
std::string operator()(){
std::string str;
std::getline(is, str);
return is ? str : std::string();
}
private:
std::istream& is;
};
class Isequ{
public:
Isequ(int i = 0) : val(i){}
bool operator()(int t){
return val == t;
}
private:
int val;
};
class StableSort{
public:
bool operator()(const std::string& a, const std::string& b){
return a.size() < b.size();
}
};
class SizeCmp{
public:
SizeCmp(std::size_t s) : sz(s){}
bool operator()(const std::string& str)const{
return str.size() > sz;
}
private:
std::size_t sz;
};
int main(){
/*
LineStr ls;
std::cout << ls() << std::endl;
*/
/*
std::vector<int> vi{23,3,5,6,78,3};
Isequ iq(3);
std::replace_if(vi.begin(), vi.end(), iq, 9);
for(int i : vi)
std::cout << i << " ";
std::cout << std::endl;
*/
/*
std::vector<std::string> vs{"1234", "123", "a", "bc"};
//stable_sort(vs.begin(), vs.end(), [](const std::string& a,
// const std::string& b){
// return a.size() < b.size();
// });
//std::stable_sort(vs.begin(), vs.end(), StableSort());
StableSort ss;
std::stable_sort(vs.begin(), vs.end(), ss);
std::size_t sz = 2;
//auto b = std::find_if(vs.cbegin(), vs.cend(), [sz](const std::string& a){
// return a.size() > sz;
// });
SizeCmp sc(3);
auto b = std::find_if(vs.cbegin(), vs.cend(), sc);
for_each(b, vs.cend(), [](const std::string& s){
std::cout << s << " ";
});
std::cout << std::endl;
for(auto s : vs)
std::cout << s << " ";
std::cout << std::endl;
*/
using std::placeholders::_1;
std::vector<int> iv {12,213,123123,434344,213232};
int cnt = std::count_if(iv.cbegin(), iv.cend(),
std::bind(std::greater<int>(), _1, 1024));
std::cout << cnt << std::endl;
std::vector<std::string> sv{"pooh", "pooh", "11","pooh","22"};
auto idx = std::find_if(sv.cbegin(), sv.cend(),
std::bind(std::not_equal_to<std::string>(),_1, "pooh"));
std::cout << *idx << std::endl;
std::vector<int> iv2 {12,3,12,4,21};
std::transform(iv2.cbegin(), iv2.cend(), iv2.begin(),
std::bind(std::multiplies<int>(), _1, 2));
for(auto i : iv2)
std::cout << i << " ";
std::cout << std::endl;
}
c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854
c/c++ 重载运算符 函数调用运算符的更多相关文章
- C++ Pirmer : 第十四章 : 重载运算符与类型转换之函数调用运算符与标准库的定义的函数对象
函数调用运算符 struct test { int operator()(int val) const { return (i > 0 ? i : -i); } }; 所谓的函数调用就是一个类重 ...
- C++赋值运算符、函数调用运算符、下标运算符(“=”、“()”、“[]”)重载
#include <iostream>#include <assert.h>#include <string.h> using namespace std; cla ...
- [C++] 重载运算符与类型转换(2)——函数调用运算符和类型转换运算符
1.这两个应该是C++中比较高级的用法了. 一.函数调用运算符 1.重载函数调用运算符(),必须是成员函数,一个类可以定义多个不同版本的调用运算符,相互之间应该在参数数量或者类型上有所区别. ...
- C++ //函数调用运算符重载 (仿函数)
1 //函数调用运算符重载 2 3 #include <iostream> 4 #include <string> 5 using namespace std; 6 7 //函 ...
- 函数调用运算符"()"
14.8函数调用运算符"()"1.函数调用运算符必须是成员函数,一个类可以定义多个不同版本的调用运算符,但是他们相互之间应该在参数数量或返回类型上有所区别.定义了调用运算符的类的对 ...
- C++重载流插入运算符和流提取运算符【转】
C++的流插入运算符“<<”和流提取运算符“>>”是C++在类库中提供的,所有C++编译系统都在类库中提供输入流类istream和输出流类ostream.cin和cout分别是 ...
- c/c++ 重载运算符 类型转换运算符
重载运算符 类型转换运算符 问题:能不能把一个类型A的对象a,转换成另一个类型B的对象b呢?? 是可以的.这就必须要用类型A的类型转换运算符(conversion operator) 下面的opera ...
- C++运算符重载——输入/输出运算符
为了与IO标准库一致,重载输入输出运算符函数的第一个行参应该是流的引用,第二个行参是对象的引用. 如果重载为类的成员函数,第一个行参应该是对象的引用,第二个行参是流的引用. 使用方式是 ClassOb ...
- operator 重载内置运算符
operator 关键字来重载内置运算符,或提供类或结构声明中的用户定义转换.它可以定义不同类型之间采用何种转化方式和转化的结果. operator用于定义类型转化时可采用2种方式,隐式转换(impl ...
随机推荐
- 【原创】一文掌握 Linux 性能分析之 I/O 篇
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 一文掌握 Li ...
- scala用ssh2连接Linux
这个需要安装库: import ch.ethz.ssh2.{Connection, Session, StreamGobbler} 首先用 ip 和 post 创建连接: val conn: Conn ...
- 关于ML.NET v1.0 RC的发布说明
ML.NET是面向.NET开发人员的开源和跨平台机器学习框架(Windows,Linux,macOS).使用ML.NET,开发人员可以利用他们现有的工具和技能组,通过为情感分析,推荐,图像分类等常见场 ...
- asp.net core系列 39 Web 应用Razor 介绍与详细示例
一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor. 这样开发Web包括了MVC框架和Razor框架.对于Razor来说 ...
- Java的类加载器种类(双亲委派)
Java类加载器采用双亲委派模型: 1.启动类加载器:这个类加载器负责放在<JAVA_HOME>\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别 ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->Web版本新增新的角色授权管理界面效率更高、更规范
角色授权管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户.可以分配或授予指定角色的模块(菜单)的访问权限.可以收回或分配指定角色的操作(功能) ...
- JSP知识点总结
一.jsp静态包含和动态包含的区别 在学习request对象的时候,我们曾经使用过request.getRequestDispatcher(String url).include(request,re ...
- Supervisor 为服务创建守护进程
今天需要再服务上部署一个.net 方面的项目:当时开启服务的命令只能在前台执行:使用nohub CMD &等放在后台开启服务都会宕机:所以搜寻了Supervisor 这个解决办法,为服务创建守 ...
- 痞子衡嵌入式:并行接口NAND标准(ONFI)及SLC Raw NAND简介
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是ONFI标准及SLC Raw NAND. NAND Flash是嵌入式世界里常见的存储器,对于嵌入式开发而言,NAND主要分为两大类:S ...
- 第一册:lesson 101。
原文: A card from Jimmy Read Jimmy's card to me please,Penny. I have just arrive in Scotland and I'm s ...