重载运算符 函数调用运算符

把一个类的对象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; }

github

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

c/c++ 重载运算符 函数调用运算符的更多相关文章

  1. C++ Pirmer : 第十四章 : 重载运算符与类型转换之函数调用运算符与标准库的定义的函数对象

    函数调用运算符 struct test { int operator()(int val) const { return (i > 0 ? i : -i); } }; 所谓的函数调用就是一个类重 ...

  2. C++赋值运算符、函数调用运算符、下标运算符(“=”、“()”、“[]”)重载

    #include <iostream>#include <assert.h>#include <string.h> using namespace std; cla ...

  3. [C++] 重载运算符与类型转换(2)——函数调用运算符和类型转换运算符

    1.这两个应该是C++中比较高级的用法了. 一.函数调用运算符   1.重载函数调用运算符(),必须是成员函数,一个类可以定义多个不同版本的调用运算符,相互之间应该在参数数量或者类型上有所区别.   ...

  4. C++ //函数调用运算符重载 (仿函数)

    1 //函数调用运算符重载 2 3 #include <iostream> 4 #include <string> 5 using namespace std; 6 7 //函 ...

  5. 函数调用运算符"()"

    14.8函数调用运算符"()"1.函数调用运算符必须是成员函数,一个类可以定义多个不同版本的调用运算符,但是他们相互之间应该在参数数量或返回类型上有所区别.定义了调用运算符的类的对 ...

  6. C++重载流插入运算符和流提取运算符【转】

    C++的流插入运算符“<<”和流提取运算符“>>”是C++在类库中提供的,所有C++编译系统都在类库中提供输入流类istream和输出流类ostream.cin和cout分别是 ...

  7. c/c++ 重载运算符 类型转换运算符

    重载运算符 类型转换运算符 问题:能不能把一个类型A的对象a,转换成另一个类型B的对象b呢?? 是可以的.这就必须要用类型A的类型转换运算符(conversion operator) 下面的opera ...

  8. C++运算符重载——输入/输出运算符

    为了与IO标准库一致,重载输入输出运算符函数的第一个行参应该是流的引用,第二个行参是对象的引用. 如果重载为类的成员函数,第一个行参应该是对象的引用,第二个行参是流的引用. 使用方式是 ClassOb ...

  9. operator 重载内置运算符

    operator 关键字来重载内置运算符,或提供类或结构声明中的用户定义转换.它可以定义不同类型之间采用何种转化方式和转化的结果. operator用于定义类型转化时可采用2种方式,隐式转换(impl ...

随机推荐

  1. MySQL优化配置之query_cache_size

    原理MySQL查询缓存保存查询返回的完整结果.当查询命中该缓存,会立刻返回结果,跳过了解析,优化和执行阶段.  查询缓存会跟踪查询中涉及的每个表,如果这写表发生变化,那么和这个表相关的所有缓存都将失效 ...

  2. 网络协议 9 - TCP协议(下):聪明反被聪明误

    网络协议 1 - 概述 网络协议 2 - IP 是怎么来,又是怎么没的? 网络协议 3 - 从物理层到 MAC 层 网络协议 4 - 交换机与 VLAN:办公室太复杂,我要回学校 网络协议 5 - I ...

  3. 准备PPT过程中的一些文档记录

    http://jm.taobao.org/2016/12/23/20161223/ https://www.csdn.net/article/2015-02-10/2823900 https://da ...

  4. Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(三):搭建jenkins集群环境

    写在前面 大家可以看到本文的配图,左边是jenkins单机环境,右边是jenkins集群.个中区别,不言而喻,形象生动. 前面我分别介绍了.net core 程序的多种部署方式(无绝对孰优孰劣): 1 ...

  5. Redis【入门】就这一篇!

    Redis 概述 在我们日常的Java Web开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一 ...

  6. 修改sql数据库名称

    USE master; GO DECLARE @SQL VARCHAR(MAX); SET @SQL='' SELECT @SQL=@SQL+'; KILL '+RTRIM(SPID) FROM ma ...

  7. 开源库支付库Magicodes.Pay发布

    Magicodes.Pay,是心莱科技团队提供的统一支付库,相关库均使用.NET标准库编写,支持.NET Framework以及.NET Core.目前支持以下支付方式和功能: 支付宝APP支付 支付 ...

  8. 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...

  9. SpringMvc 请求中日期类型参数接收一二事儿

    首先说明:以版本为Spring 4.3.0为测试对象: 开启<mvc:annotation-driven /> 测试场景一:请求中含有date属性,该类型为日期类型,SpringMvc采用 ...

  10. 树莓派3B+通过路由器进SSH和VNC

    1.打开树莓派官网 www.raspberrypi.org 选择 ”Raspbian Stretch with desktop and recommended software“ 并下载 镜像包含推荐 ...