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; }