zoukankan      html  css  js  c++  java
  • 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;
      
    }
    
    

    github

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

    本人微信:xiaoshitou5854

  • 相关阅读:
    《linux内核设计与实现》读书笔记第十八章
    20135337朱荟潼 Linux第八周学习总结——进程的切换和系统的一般执行过程
    2013337朱荟潼 Linux第四章读书笔记——进程调度
    2013337朱荟潼 Linux&深入理解计算机系统第七章读书笔记——链接
    20135337朱荟潼 Linux第七周学习总结——可执行程序的装载
    2013337朱荟潼 Linux第三章读书笔记——进程管理
    20135337朱荟潼 Linux第六周学习总结——进程的描述和进程的创建
    2013337朱荟潼 Linux第十八章读书笔记——调试
    20135337朱荟潼 Linux第五周学习总结——扒开系统调用的三层皮(下)
    2013337朱荟潼 Linux第五章读书笔记——系统调用
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/10176824.html
Copyright © 2011-2022 走看看