//仿函数就是使一个类的使用看上去像一个函数。其实就是类中重载了()操作符,这个类就有了类似函数的行为,就是一个仿函数类。 struct Stock { std::string _name; std::string _code; Stock(const std::string& name,const std::string& code) { _name = name; _code = code; } } CFitted类构造函数作为传参,并且重载了()运算符,那么是可以直接声明一个该类的类对象,直接作为函数的指针使用 // class CFitted { pubilc: CFitted(const std:: string& name,const std::string& code);m_strName(name),m_strCode(code) {} bool operator()(const Stock& stk) const { return stk.name == m_strName && std._code == m_strCode; } private: std::string m_strName; std::string m_strCode; } bool IsFitted(const Stock& stk) { std::string strName = "平安银行"; std::string strCode = "000001"; return stk._name == strName && stk._code == strCode; } void main() { std::vector<Stock>vec{Stock("平安银行","000001"), Stock("万科","000002"),Stock("国农科技","000004"),Stock("世纪星源","000005")}; auto it = std::find_if(vec.begin(),vec.end(),CFitted(5)); std::cout<<(*it)._name<<" "<<(*it)._code<<std::endl; } //使用仿函数 auto it = std::find_if(vec.begin(),vec.end(),CFitted("平安银行","000005")); c11中引入了Lambda表达式 [capture list] (params list) mutable exception-> return type { function body } 它主要由以下四个部分组成: 1),capture list:捕获外部变量列表 2),params list:形参列表 3),mutable:标明是否可以修改捕获的变量 4),return type:返回类型 5),function body:函数体 Lambda表达式的格式并不是固定不变的,我们可以省略某些部分来声明一个“不完整”的Lambda表达式。比如:正常使用中,我们很少会用到return type,因为Lambda表达式可以根据function body中的返回值来判断返回类型。省略params list时,也就相当于一个普通的无参函数。 ———————————————— 版权声明:本文为CSDN博主「Simple Simple」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/bajianxiaofendui/article/details/86583612 find_if是个算法 Lambda外部变量捕获 1、值捕获 值捕获和参数传递中的值传递类似,被捕获的变量的值在Lambda表达式创建时通过值拷贝的方式传入,因此随后对该变量的修改不会影响影响Lambda表达式中的值 { std::vector<Stock> vec{..}; { Stock stCmp("平安银行","000001"); auto it = std::find_if(vec.begin(),vec.end(), [stCmp](Stock st) {return st._code == stCmp._code && st.name == stCmp._name});; std::cout<<"查找结果:"<<(*it)._name<<""<<(*it)._code <<std::endl; std::cout<<"stCmp:"<<stCmp._name<<" "<<stCmp._code<<std::endl; } } 2、引用捕获 使用引用捕获一个外部变量,只需要在捕获列表变量前面加上一个引用说明符&。引用捕获结合mutable说明符,可以对外部变量进行修改。 将上述的Lambda表达式改写为 { std::vector<Stock> vec{....}; { Stock stCmp("平安银行","000001"); auto it = std::find_if(vec.begin(),vec.end(), [&stCmp](Stock st)mutable{stCmp._name = "平安银行改名了";st._code == stCmp._code}); std::cout<<"查找结果"<<(*it)._name<<" "<<(*it)._code<<std::endl; std::cout<<"stCmp" <<stCmp._name << " "<<stCmp._code<<std::endl; } } 3、=和&隐式捕获 =和&允许Lambda表达式捕获所有外部变量,=是值捕获,&是引用捕获。 以=为例: { std::vector<Stock> vec{....}; { Stock stCmp("平安银行","000001"); auto it = std::find_if(vec.begin(),vec.end(), [=](Stock st)mutable{stCmp._name = "平安银行改名了";return st._code == stCmp._code}); std::cout<<"查找结果"<<(*it)._name<<" "<<(*it)._code<<std::endl; std::cout<<"stCmp" <<stCmp._name << " "<<stCmp._code<<std::endl; } }
仿函数的小节
最新推荐文章于 2025-08-10 00:01:57 发布