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

把一个类的对象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. 关于video标签移动端开发遇到的问题,获取视频第一帧,全屏,自动播放,自适应等问题

    最近一直在处理video标签在IOS和Android端的兼容问题,其中遇到不少坑,绝大多数问题已经解决,下面是处理问题经验的总结: 1.获取视频的第一帧作为背景图: 技术:canvas绘图 windo ...

  2. pycharm(Python编辑器)的激活

    1.将“0.0.0.0 account.jetbrains.com”中的内容添加到hosts文件中,hosts路径为:C:\Windows\System32\drivers\etc mac用户的hos ...

  3. 英语笔记3(git)

    一: To create a new branch and switch to it at the same time, you can run the git checkout command wi ...

  4. [IOI2007] sails 船帆

    显然答案与杆的顺序无关(按每个高度考虑). 从高到低考虑杆,设此时的状态为\(S\),\(S[i]\)是高度\(i\)的帆的数目,初始全为\(0\),当前杆的高度为\(h\),杆上需要放置的帆的数目为 ...

  5. Python时间和时间戳互相转换

    # 将时间变成时间戳 def tranftimestamp(stringtime): try: return time.mktime(time.strptime(stringtime, "% ...

  6. 前端(各种demo)一:css实现三角形,css实现梯形,pop弹层,css伪类before,after使用,svg使用(持续更新中)

    各种demo: 1.css实现正方形 思路:width为0:height为0:使用boder-width为正方形的边长的一半,不占任何字节:border-style为固体:border-color为正 ...

  7. Leetcode 10. 正则表达式匹配 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  8. 带着新人学springboot的应用04(springboot+mybatis+redis 完)

    对于缓存也说了比较多了,大家对下图这一堆配置类现在应该有些很粗略的认识了(因为我也就很粗略的认识了一下,哈哈!),咳,那么我们怎么切换这个缓存呢?(就是不用springboot提供的默认的Simple ...

  9. 版本管理工具Git(二)GitLab部署和配置

    安装 # 安装依赖包 sudo yum install -y curl policycoreutils-python openssh-server # 启用并启动SSHD sudo systemctl ...

  10. 冗余jar包识别神器 - loose.jar

    冗余jar包识别神器 - loose.jar 场景描述 项目迭代久了,会添加各类jar包,事实上很多jar包其实根本没用到.那如何快速识别冗余的jar,以方便从项目中清除掉呢? 比如: 该简单的测试工 ...