欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c/c++ 重载运算符 函数调用运算符

程序员文章站 2022-05-17 19:26:42
重载运算符 函数调用运算符 把一个类的对象a,当成函数来使用,比如a(),所以需要重载operator()方法。重载了函数调用运算符的类的对象,就是函数对象了。 还有什么是函数对象呢??? lambda是函数对象 std::bind函数的返回值是函数对象 函数是函数对象 函数指针是函数对象 那函数对 ......

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

把一个类的对象a,当成函数来使用,比如a(),所以需要重载operator()方法。重载了函数调用运算符的类的对象,就是函数对象了。

还有什么是函数对象呢???

  • lambda是函数对象
  • std::bind函数的返回值是函数对象
  • 函数是函数对象
  • 函数指针是函数对象

函数对象是做什么用的呢???

  • 在标准算法中使用,比如std::(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

c/c++ 重载运算符 函数调用运算符

本人微信:xiaoshitou5854