c/c++ 重载运算符 函数调用运算符
生活随笔
收集整理的這篇文章主要介紹了
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
轉載于:https://www.cnblogs.com/xiaoshiwang/p/10176824.html
總結
以上是生活随笔為你收集整理的c/c++ 重载运算符 函数调用运算符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 孕妇梦到摘橘子是什么意思
- 下一篇: C++常用的系统函数