Difference between revisions of "Intermediate C++ Game Programming Tutorial 16"
From Chilipedia
(→Video Timestamp Index) |
(→Video Timestamp Index) |
||
Line 21: | Line 21: | ||
* Introducing Lambda functions to replace custom functors [https://youtu.be/3J1Pz30IE4Q?t=11m51s 11:51] | * Introducing Lambda functions to replace custom functors [https://youtu.be/3J1Pz30IE4Q?t=11m51s 11:51] | ||
* Using the Lambda capture to bring in variables into the Lambda function [https://youtu.be/3J1Pz30IE4Q?t=13m34s 13:34]<br />- Capture syntax explained: [varl],[&var],[=],[&],[newvar=var+10],[this], capture multiple variables, mix&match capture modes <br />- Stateful Lambdas; changing captured lambda variables using the <code>mutable</code> flag [https://youtu.be/3J1Pz30IE4Q?t=15m59s 15:59] | * Using the Lambda capture to bring in variables into the Lambda function [https://youtu.be/3J1Pz30IE4Q?t=13m34s 13:34]<br />- Capture syntax explained: [varl],[&var],[=],[&],[newvar=var+10],[this], capture multiple variables, mix&match capture modes <br />- Stateful Lambdas; changing captured lambda variables using the <code>mutable</code> flag [https://youtu.be/3J1Pz30IE4Q?t=15m59s 15:59] | ||
− | * Some anxiety reducing consolation by Chili [https://youtu.be/3J1Pz30IE4Q?t=16m40s 16:40] | + | * Some anxiety-reducing consolation by Chili [https://youtu.be/3J1Pz30IE4Q?t=16m40s 16:40] |
* Syntax for a callable Lambda function [https://youtu.be/3J1Pz30IE4Q?t=17m03s 17:03] <br />- Make it callable once: <code>[...](...){...}(vec.front());</code>, functor is destroyed immediately<br />- Keep the functor using <code>auto mylamb = [...](...){...};</code>, which can be called by <code>bool result = mylamb(vec.front())</code>, or <code>std::remove_if(...,...,mylamb);</code> | * Syntax for a callable Lambda function [https://youtu.be/3J1Pz30IE4Q?t=17m03s 17:03] <br />- Make it callable once: <code>[...](...){...}(vec.front());</code>, functor is destroyed immediately<br />- Keep the functor using <code>auto mylamb = [...](...){...};</code>, which can be called by <code>bool result = mylamb(vec.front())</code>, or <code>std::remove_if(...,...,mylamb);</code> | ||
* The power of C++ is in its flexibility. Example code for converting a string to lowercase:<br /><code>std::transform(str.begin(),str.end(),str.begin(),::tolower);</code>[https://youtu.be/3J1Pz30IE4Q?t=17m49s 17:49] | * The power of C++ is in its flexibility. Example code for converting a string to lowercase:<br /><code>std::transform(str.begin(),str.end(),str.begin(),::tolower);</code>[https://youtu.be/3J1Pz30IE4Q?t=17m49s 17:49] |
Revision as of 05:22, 29 September 2019
In the video we take a look at a couple of bangers from <algorithm>
, and we learn what lambda functions are and how to use them.
Contents
Topics Covered
- Algorithms
std::sort
andstd::remove_if
- Concepts (as in, type concepts like Comparable)
-
<functional>
functors as predicates - Lambda functions
Errata
In the video Chili states that std::remove does not preserve the relative order of elements in the container, but this is fake news! Relative order is preserved: [1]
Video Timestamp Index
- Generic Algorithms: how Templates and Iterators make Algorithms independent of Data Types and Containers 0:17
- The
std::sort
algorithm and its requirements 0:43 - Sorting a (forward) list
std::list
, using its member functionstd::list::sort()
2:16 - Introducing Concepts / named requirements of types (e.g., the
Compare
requirement ofstd::sort
) 2:54 - Modyfing sorting order by passing a comparison function object (functor) as a predicate, like so:
std::sort(vec.begin(),vec.end(),std::greater<int>{});
3:17
Note: vec is a std::vector of integers - Sort custom types, example code for sorting a custom class object by creating a functor, called like so:
std::sort(vecObj.begin(),vecObj.end(),Obj::YLess{});
4:07 - Removing items from a container,
std::remove
andstd::remove_if
6:11
- Create a functor as a unary predicate for thestd::remove
function to remove elements using a threshold variable 8:28
- Use container member functionerase()
to correct the endpoint of the container after the remove operation 9:51 - Introducing Lambda functions to replace custom functors 11:51
- Using the Lambda capture to bring in variables into the Lambda function 13:34
- Capture syntax explained: [varl],[&var],[=],[&],[newvar=var+10],[this], capture multiple variables, mix&match capture modes
- Stateful Lambdas; changing captured lambda variables using themutable
flag 15:59 - Some anxiety-reducing consolation by Chili 16:40
- Syntax for a callable Lambda function 17:03
- Make it callable once:[...](...){...}(vec.front());
, functor is destroyed immediately
- Keep the functor usingauto mylamb = [...](...){...};
, which can be called bybool result = mylamb(vec.front())
, orstd::remove_if(...,...,mylamb);
- The power of C++ is in its flexibility. Example code for converting a string to lowercase:
std::transform(str.begin(),str.end(),str.begin(),::tolower);
17:49 - Homework assignment 18:39
- Introducing the Algorithm STD Gems series that takes a deep dive into its functionality 19:20
Homework
Solve the problems in Source.cpp attached below using the <algorithm> library and other parts of the standard library as extensively as possible. As a bonus problem, implement the sprite drawing effect shown at the end of the video using a lambda function.
Related Series
For an in-depth look into the <algorithm> library and beyond, check out STD Gems.