lambda
来源:互联网 发布:60数据库 编辑:程序博客网 时间:2024/05/16 09:29
#include<functional>#include<iostream>std::function<int(int, int)> returnLambda(){return [](int x, int y) {return x*y;};}int main(){auto lf = returnLambda();std::cout << lf(6, 7) << std::endl;}
输出结果:42
lambda 与 bind对比
#include <functional>#include <iostream>int main(){auto plus10 = std::bind(std::plus<int>(),std::placeholders::_1,10);std::cout << "+10: " << plus10(7) << std::endl;auto plus10times2 = std::bind(std::multiplies<int>(),std::bind(std::plus<int>(),std::placeholders::_1,10),2);std::cout << "+10 *2: " << plus10times2(7) << std::endl;auto pow3 = std::bind(std::multiplies<int>(),std::bind(std::multiplies<int>(),std::placeholders::_1,std::placeholders::_1),std::placeholders::_1);std::cout << "x*x*x: " << pow3(7) << std::endl;auto inversDivide = std::bind(std::divides<double>(),std::placeholders::_2,std::placeholders::_1);std::cout << "invdiv: " << inversDivide(49, 7) << std::endl;}
#include <iostream>int main(){auto plus10 = [](int i) {return i + 10;};std::cout << "+10: " << plus10(7) << std::endl;auto plus10times2 = [](int i) {return (i + 10) * 2;};std::cout << "+10 *2: " << plus10times2(7) << std::endl;auto pow3 = [](int i) {return i*i*i;};std::cout << "x*x*x: " << pow3(7) << std::endl;auto inversDivide = [](double d1, double d2) {return d2 / d1;};std::cout << "invdiv: " << inversDivide(49, 7) << std::endl;}
lambda与function objects
#include <iostream>#include <vector>#include <algorithm>using namespace std;// function object to process the mean valueclass MeanValue { private: long num; // number of elements long sum; // sum of all element values public: // constructor MeanValue () : num(0), sum(0) { } // "function call" // - process one more element of the sequence void operator() (int elem) { ++num; // increment count sum += elem; // add value } // return mean value double value () { return static_cast<double>(sum) / static_cast<double>(num); }};int main(){ vector<int> coll = { 1, 2, 3, 4, 5, 6, 7, 8 }; // process and print mean value MeanValue mv = for_each (coll.begin(), coll.end(), // range MeanValue()); // operation //for_each() has the unique ability to return its function object cout << "mean value: " << mv.value() << endl;}
#include <iostream>#include <vector>#include <algorithm>using namespace std;int main(){vector<int> coll = { 1, 2, 3, 4, 5, 6, 7, 8 };// process and print mean valuelong sum = 0;for_each(coll.begin(), coll.end(), // range[&sum](int elem) {sum += elem;});double mv = static_cast<double>(sum) / static_cast<double>(coll.size());cout << "mean value: " << mv << endl;}
lambda与stateful function objects
#include <iostream>#include <list>#include <algorithm>#include "print.hpp"using namespace std;class Nth { // function object that returns true for the nth call private: int nth; // call for which to return true int count; // call counter public: Nth (int n) : nth(n), count(0) { } bool operator() (int) { return ++count == nth; }};int main(){ list<int> coll = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; PRINT_ELEMENTS(coll,"coll: "); // remove third element list<int>::iterator pos; pos = remove_if(coll.begin(),coll.end(), // range Nth(3)); // remove criterion coll.erase(pos,coll.end()); PRINT_ELEMENTS(coll,"3rd removed: ");}
输出结果:
coll: 1 2 3 4 5 6 7 8 9 10
3rd removed: 1 2 4 5 7 8 9 10
#include <iostream>#include <list>#include <algorithm>#include "print.hpp"using namespace std;int main(){ list<int> coll = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; PRINT_ELEMENTS(coll,"coll: "); // remove third element list<int>::iterator pos; int count=0; // call counter pos = remove_if(coll.begin(),coll.end(), // range [count] (int) mutable { // remove criterion return ++count == 3; }); coll.erase(pos,coll.end()); PRINT_ELEMENTS(coll,"3rd removed: ");}
coll: 1 2 3 4 5 6 7 8 9 10
3rd removed: 1 2 4 5 7 8 9 10
If you pass the argument by reference and don’t use mutable, the behavior is as expected,
because both lambda objects internally used by remove_if() share the same state. Thus, with
the following:
int count=0; // call counterpos = remove_if(coll.begin(),coll.end(), // range[&count] (int) { // remove criterionreturn ++count == 3;});
the output is:
coll: 1 2 3 4 5 6 7 8 9 10
3rd removed: 1 2 4 5 6 7 8 9 10
#include <iostream>#include <algorithm>#include <functional>#include <locale>#include <string>using namespace std;using namespace std::placeholders;char myToupper (char c){ std::locale loc; return std::use_facet<std::ctype<char> >(loc).toupper(c);}int main(){ string s("Internationalization"); string sub("Nation"); // search substring case insensitive string::iterator pos; pos = search (s.begin(),s.end(), // string to search in sub.begin(),sub.end(), // substring to search bind(equal_to<char>(), // compar. criterion bind(myToupper,_1), bind(myToupper,_2))); if (pos != s.end()) { cout << "\"" << sub << "\" is part of \"" << s << "\"" << endl; }}
#include <iostream>#include <algorithm>#include <locale>#include <string>using namespace std;char myToupper (char c){ std::locale loc; return std::use_facet<std::ctype<char> >(loc).toupper(c);}int main(){ string s("Internationalization"); string sub("Nation"); // search substring case insensitive string::iterator pos; pos = search (s.begin(),s.end(), // string to search in sub.begin(),sub.end(), // substring to search [] (char c1, char c2) { // compar. criterion return myToupper(c1)==myToupper(c2); }); if (pos != s.end()) { cout << "\"" << sub << "\" is part of \"" << s << "\"" << endl; }}
calling member functions
#include <functional>#include <algorithm>#include <vector>#include <iostream>#include <string>using namespace std;using namespace std::placeholders;class Person { private: string name; public: Person (const string& n) : name(n) { } void print () const { cout << name << endl; } void print2 (const string& prefix) const { cout << prefix << name << endl; } //...};int main(){ vector<Person> coll = { Person("Tick"), Person("Trick"), Person("Track") }; // call member function print() for each person for_each (coll.begin(), coll.end(), bind(&Person::print,_1)); cout << endl; // call member function print2() with additional argument for each person for_each (coll.begin(), coll.end(), bind(&Person::print2,_1,"Person: ")); cout << endl; // call print2() for temporary Person bind(&Person::print2,_1,"This is: ")(Person("nico"));}
#include <functional>#include <algorithm>#include <vector>#include <iostream>#include <string>using namespace std;using namespace std::placeholders;class Person {private:string name;public:Person(const string& n) : name(n) {}void print() const {cout << name << endl;}void print2(const string& prefix) const {cout << prefix << name << endl;}//...};int main(){vector<Person> coll= { Person("Tick"), Person("Trick"), Person("Track") };// call member function print() for each personfor_each(coll.begin(), coll.end(),[](const Person& p) {p.print();});cout << endl;// call member function print2() with additional argument for each personfor_each(coll.begin(), coll.end(),[](const Person& p) {p.print2("Person: ");});}
Using lambdas as hash function and equivalence criterion
//print.hpp#include <iostream>#include <string>// PRINT_ELEMENTS()// - prints optional string optstr followed by// - all elements of the collection coll// - in one line, separated by spacestemplate <typename T>inline void PRINT_ELEMENTS(const T& coll,const std::string& optstr = ""){std::cout << optstr;for (const auto& elem : coll) {std::cout << elem << ' ';}std::cout << std::endl;}
//hashval.hpp#pragma once#include <functional>// from boost (functional/hash):// see http://www.boost.org/doc/libs/1_35_0/doc/html/hash/combine.htmltemplate <typename T>inline void hash_combine(std::size_t& seed, const T& val){seed ^= std::hash<T>()(val) + 0x9e3779b9 + (seed << 6) + (seed >> 2);}// auxiliary generic functions to create a hash value using a seedtemplate <typename T>inline void hash_val(std::size_t& seed, const T& val){hash_combine(seed, val);}template <typename T, typename... Types>inline void hash_val(std::size_t& seed,const T& val, const Types&... args){hash_combine(seed, val);hash_val(seed, args...);}// auxiliary generic function to create a hash value out of a heterogeneous list of argumentstemplate <typename... Types>inline std::size_t hash_val(const Types&... args){std::size_t seed = 0;hash_val(seed, args...);return seed;}
//main.cpp#include <string>#include <iostream>#include <unordered_set>#include "hashval.hpp"#include <functional>#include "print.hpp"using namespace std;class Customer {private:string fname;string lname;long no;public:Customer(const string& fn, const string& ln, long n): fname(fn), lname(ln), no(n) {}string firstname() const {return fname;};string lastname() const {return lname;};long number() const {return no;};friend ostream& operator << (ostream& strm, const Customer& c) {return strm << "[" << c.fname << "," << c.lname << "," << c.no << "]";}};int main(){// lambda for user-defined hash functionauto hash = [](const Customer& c) {return hash_val(c.firstname(), c.lastname(), c.number());};// lambda for user-defined equality criterionauto eq = [](const Customer& c1, const Customer& c2) {return c1.number() == c2.number();};// create unordered set with user-defined behaviorunordered_set<Customer, decltype(hash), decltype(eq)> custset(10, hash, eq);// ERROR: unordered_set<Customer,function<size_t(Customer,Customer)>,decltype(eq)> custset(10,hash,eq);custset.insert(Customer("nico", "josuttis", 42));PRINT_ELEMENTS(custset);}
0 0
- Lambda
- lambda
- lambda
- lambda
- Lambda
- lambda
- lambda
- Lambda
- Lambda
- lambda
- lambda
- lambda
- lambda
- lambda
- lambda
- lambda
- lambda
- lambda
- POJ 3176 Cow Bowling 动态规划
- HDU 5585 Numbers
- Android系列---JSON数据解析
- HDU 5590 ZYB's Biology
- Leetcode Maximal Square
- lambda
- HDU 5595 GTW likes math
- jQuery插件写法总结以及面向对象方式写法总结
- SpatialHadoop中空间索引系列之(四)空间格网索引实现
- 快速排序
- Git幕后的“故事”
- 何时使用static类(工具类)
- 高效操作字串的String Reference类
- 有时间时可以做个基于OSGEARTH的产品