From 54c67dfb38d1bb2a9dc004b3244d2ae3102107f3 Mon Sep 17 00:00:00 2001 From: bk2dcradle Date: Thu, 29 Oct 2015 22:13:24 +0530 Subject: [c++] Added Lambda Expressions and Range for --- c++.html.markdown | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/c++.html.markdown b/c++.html.markdown index d03092e5..6033ca06 100644 --- a/c++.html.markdown +++ b/c++.html.markdown @@ -801,6 +801,106 @@ void doSomethingWithAFile(const std::string& filename) // all automatically destroy their contents when they fall out of scope. // - Mutexes using lock_guard and unique_lock +/////////////////////////////////////// +// Lambda Expressions (C++11 and above) +/////////////////////////////////////// + +// lambdas are a convenient way of defining an anonymous function +// object right at the location where it is invoked or passed as +// an argument to a function. + +// Example consider sorting a vector of pairs using the second +// value of the pair + +vector > tester; +tester.push_back(make_pair(3, 6)); +tester.push_back(make_pair(1, 9)); +tester.push_back(make_pair(5, 0)); + +// Pass a lambda expression as third argument to the sort function +// sort is from the header + +sort(tester.begin(), tester.end(), [](const pair &lhs, const pair &rhs) { + return lhs.second < rhs.second; + }); + +// Notice the syntax of the lambda expression, +// [] in the lambda is used to "capture" variables. +// For Example: + +vector dog_ids; +// number_of_dogs = 3; +for(int i = 0; i < 3; i++){ + dog_ids.push_back(i); +} + +int weight[3]; +weight[0] = 30, weight[1] = 50, weight[2] = 10; + +// Say you want to sort dog_ids according to the dogs' weights +// So dog_ids should in the end become: [2, 0, 1] + +// Here's where lambda expressions come in handy + +sort(dog_ids.begin(), dog_ids.end(), [weight](const int &lhs, const int &rhs) { + return weight[lhs] < weight[rhs]; + }); +// Note we captured "weight" in the above example. + +// lambda are really useful for the case of structs +// You can use lambda expressions instead of overloading +// the "<" operator + +struct dog{ + int weight, age; +}dogs[3]; + +dogs[0].weight = 30, dogs[0].age = 4; +dogs[1].weight = 40, dogs[1].age = 10; +dogs[2].weight = 20, dogs[2].age = 9; + +// Say I want to sort the dogs array by the dogs' weights + +sort(dogs, dogs+3, [](const dog &lhs, const dog &rhs) { + return lhs.weight < rhs.weight; + }); +// dogs is now sorted according to their weight + +// Do something with the dogs + +// Now I want to sort the dogs by in descending order of their age + +sort(dogs, dogs+3, [](const dog &lhs, const dog &rhs) { + return lhs.age > rhs.age; + }); +// dogs is now sorted in descending order of their age + + +/////////////////////////////// +// Range For (C++11 and above) +/////////////////////////////// + +// You can use a range for loop to iterate over a container +int arr[] = {1, 10, 3}; + +for(int elem: arr){ + cout< Date: Tue, 5 Jan 2016 13:25:56 +0530 Subject: Update --- c++.html.markdown | 48 +++++++----------------------------------------- 1 file changed, 7 insertions(+), 41 deletions(-) diff --git a/c++.html.markdown b/c++.html.markdown index 6033ca06..c1bacf6a 100644 --- a/c++.html.markdown +++ b/c++.html.markdown @@ -809,7 +809,7 @@ void doSomethingWithAFile(const std::string& filename) // object right at the location where it is invoked or passed as // an argument to a function. -// Example consider sorting a vector of pairs using the second +// For example, consider sorting a vector of pairs using the second // value of the pair vector > tester; @@ -820,7 +820,7 @@ tester.push_back(make_pair(5, 0)); // Pass a lambda expression as third argument to the sort function // sort is from the header -sort(tester.begin(), tester.end(), [](const pair &lhs, const pair &rhs) { +sort(tester.begin(), tester.end(), [](const pair& lhs, const pair& rhs) { return lhs.second < rhs.second; }); @@ -834,48 +834,22 @@ for(int i = 0; i < 3; i++){ dog_ids.push_back(i); } -int weight[3]; -weight[0] = 30, weight[1] = 50, weight[2] = 10; +int weight[3] = {30, 50, 10}; // Say you want to sort dog_ids according to the dogs' weights // So dog_ids should in the end become: [2, 0, 1] // Here's where lambda expressions come in handy -sort(dog_ids.begin(), dog_ids.end(), [weight](const int &lhs, const int &rhs) { +sort(dog_ids.begin(), dog_ids.end(), [&weight](const int &lhs, const int &rhs) { return weight[lhs] < weight[rhs]; }); -// Note we captured "weight" in the above example. +// Note we captured "weight" by reference in the above example. // lambda are really useful for the case of structs // You can use lambda expressions instead of overloading // the "<" operator -struct dog{ - int weight, age; -}dogs[3]; - -dogs[0].weight = 30, dogs[0].age = 4; -dogs[1].weight = 40, dogs[1].age = 10; -dogs[2].weight = 20, dogs[2].age = 9; - -// Say I want to sort the dogs array by the dogs' weights - -sort(dogs, dogs+3, [](const dog &lhs, const dog &rhs) { - return lhs.weight < rhs.weight; - }); -// dogs is now sorted according to their weight - -// Do something with the dogs - -// Now I want to sort the dogs by in descending order of their age - -sort(dogs, dogs+3, [](const dog &lhs, const dog &rhs) { - return lhs.age > rhs.age; - }); -// dogs is now sorted in descending order of their age - - /////////////////////////////// // Range For (C++11 and above) /////////////////////////////// @@ -884,24 +858,16 @@ sort(dogs, dogs+3, [](const dog &lhs, const dog &rhs) { int arr[] = {1, 10, 3}; for(int elem: arr){ - cout< Date: Tue, 5 Jan 2016 13:36:23 +0530 Subject: Add my Changes --- c++.html.markdown | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/c++.html.markdown b/c++.html.markdown index f4aa2f5a..31dbe064 100644 --- a/c++.html.markdown +++ b/c++.html.markdown @@ -820,6 +820,73 @@ std::map fooMap; fooMap[Foo(1)] = 1; fooMap.find(Foo(1)); //true +/////////////////////////////////////// +// Lambda Expressions (C++11 and above) +/////////////////////////////////////// + +// lambdas are a convenient way of defining an anonymous function +// object right at the location where it is invoked or passed as +// an argument to a function. + +// For example, consider sorting a vector of pairs using the second +// value of the pair + +vector > tester; +tester.push_back(make_pair(3, 6)); +tester.push_back(make_pair(1, 9)); +tester.push_back(make_pair(5, 0)); + +// Pass a lambda expression as third argument to the sort function +// sort is from the header + +sort(tester.begin(), tester.end(), [](const pair& lhs, const pair& rhs) { + return lhs.second < rhs.second; + }); + +// Notice the syntax of the lambda expression, +// [] in the lambda is used to "capture" variables. +// For Example: + +vector dog_ids; +// number_of_dogs = 3; +for(int i = 0; i < 3; i++){ + dog_ids.push_back(i); +} + +int weight[3] = {30, 50, 10}; + +// Say you want to sort dog_ids according to the dogs' weights +// So dog_ids should in the end become: [2, 0, 1] + +// Here's where lambda expressions come in handy + +sort(dog_ids.begin(), dog_ids.end(), [&weight](const int &lhs, const int &rhs) { + return weight[lhs] < weight[rhs]; + }); +// Note we captured "weight" by reference in the above example. + +// lambda are really useful for the case of structs +// You can use lambda expressions instead of overloading +// the "<" operator + +/////////////////////////////// +// Range For (C++11 and above) +/////////////////////////////// + +// You can use a range for loop to iterate over a container +int arr[] = {1, 10, 3}; + +for(int elem: arr){ + cout << elem << endl; +} + +// You can use "auto" and not worry about the type of the elements of the container +// For example: + +for(auto elem: arr) { + // Do something with each element of arr +} + ///////////////////// // Fun stuff ///////////////////// -- cgit v1.2.3 From e6866f5a26dab28d2d1b5628fbb18139c36a5139 Mon Sep 17 00:00:00 2001 From: bk2dcradle Date: Fri, 8 Jan 2016 01:21:38 +0530 Subject: More Fixes --- c++.html.markdown | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/c++.html.markdown b/c++.html.markdown index 31dbe064..44cad665 100644 --- a/c++.html.markdown +++ b/c++.html.markdown @@ -840,16 +840,22 @@ tester.push_back(make_pair(5, 0)); // sort is from the header sort(tester.begin(), tester.end(), [](const pair& lhs, const pair& rhs) { - return lhs.second < rhs.second; - }); + return lhs.second < rhs.second; + }); // Notice the syntax of the lambda expression, -// [] in the lambda is used to "capture" variables. -// For Example: +// [] in the lambda is used to "capture" variables +// The "Capture List" defines what from the outside of the lambda should be available inside the function body and how. +// It can be either: +// 1. a value : [x] +// 2. a reference : [&x] +// 3. any variable currently in scope by reference [&] +// 4. same as 3, but by value [=] +// Example: vector dog_ids; // number_of_dogs = 3; -for(int i = 0; i < 3; i++){ +for(int i = 0; i < 3; i++) { dog_ids.push_back(i); } @@ -861,13 +867,10 @@ int weight[3] = {30, 50, 10}; // Here's where lambda expressions come in handy sort(dog_ids.begin(), dog_ids.end(), [&weight](const int &lhs, const int &rhs) { - return weight[lhs] < weight[rhs]; - }); + return weight[lhs] < weight[rhs]; + }); // Note we captured "weight" by reference in the above example. - -// lambda are really useful for the case of structs -// You can use lambda expressions instead of overloading -// the "<" operator +// More on Lambdas in C++ : http://stackoverflow.com/questions/7627098/what-is-a-lambda-expression-in-c11 /////////////////////////////// // Range For (C++11 and above) -- cgit v1.2.3