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 ...
随机推荐
- python之zipfile
1 简述 zip文件是一个常用的归档和与压缩标准. zipfile模块提供了创建.读取.写入.添加及列出zip文件的工具. zipfile里有2个非常常用的class,分别是Zipfile和ZipIn ...
- 用CSS实现一个抽奖转盘
效果 基本是用CSS实现的,没有用图片,加一丢丢JS.完全没有考虑兼容性. 首先画一个转盘, <!DOCTYPE html> <html lang="en"> ...
- ESXI开启snmp协议方法
公司用VMware做虚拟化,15+HPE 服务器做集群,现需要用zabbix监控其状态,于是想通过打开主机的snmp协议来采集数据,监控其状态,注意其数据是ESXI系统返回的. ssh登录到ESXI上 ...
- 《你必须知道的.NET》读书实践:一个基于OO的万能加载器的实现
此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.关于万能加载器 简而言之,就是孝顺的小王想开发一个万能程序,可以一键式打开常见的计算机资料,例如: ...
- Zend与PHP之间到底是什么关系
Zend与PHP之间是什么关系 What is Zend's relationship with PHP? 每次看到PHP虚拟机中出现zend.zendvar之类的都很困惑,特意查了一下... PHP ...
- 详解intellij idea搭建SSM框架(spring+maven+mybatis+mysql+junit)(上)
SSM(Spring+SpringMVC+MyBatis)框架集由Spring.SpringMVC.MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架. 其中spring是一个轻 ...
- [Leetcode]237. Delete Node in a Linked List -David_Lin
Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...
- 贝叶斯个性化排序(BPR)算法小结
在矩阵分解在协同过滤推荐算法中的应用中,我们讨论过像funkSVD之类的矩阵分解方法如何用于推荐.今天我们讲另一种在实际产品中用的比较多的推荐算法:贝叶斯个性化排序(Bayesian Personal ...
- reStructuredText的学习
reStructruedText的学习相比makedown语法更多一些. 需要学习的也是比较多的.我整理了下.把笔记放到readthedoc上,也是方便大家学习和理解. 预览图: reStructur ...
- JDK源码分析(10)之 Hashtable 相关
本文的目的并不是让你对Hashtable更加了解,然后灵活运用:因为Hashtable的一个历史遗留的类,目前并不建议使用,所以本文主要和HashMap对比,感受同样功能的不同实现,知道什么是好的代码 ...