C++ Primer, Fifth Edition
empty. If we omit the return type, the lambda has an inferred return type that
depends on the code in the function body. If the function body is just a return
statement, the return type is inferred from the type of the expression that is returned.
Otherwise, the return type is void.
Note
Lambdas with function bodies that contain anything other than a single
return statement that do not specify a return type return void.
Passing Arguments to a Lambda
As with an ordinary function call, the arguments in a call to a lambda are used to
initialize the lambda’s parameters. As usual, the argument and parameter types must
match. Unlike ordinary functions, a lambda may not have default arguments (§ 6.5.1,
p. 236). Therefore, a call to a lambda always has as many arguments as the lambda
has parameters. Once the parameters are initialized, the function body executes.
As an example of a lambda that takes arguments, we can write a lambda that
behaves like our isShorter function:
Click here to view code image
[](const string &a, const string &b)
{ return a.size() < b.size();}
The empty capture list indicates that this lambda will not use any local variables from
the surrounding function. The lambda’s parameters, like the parameters to
isShorter, are references to const string. Again like isShorter, the lambda’s
function body compares its parameters’ size()s and returns a bool that depends on
the relative sizes of the given arguments.
We can rewrite our call to stable_sort to use this lambda as follows:
Click here to view code image
// sort words by size, but maintain alphabetical order for words of the same size
stable_sort(words.begin(), words.end(),
[](const string &a, const string &b)
{ return a.size() < b.size();});
When stable_sort needs to compare two elements, it will call the given lambda
expression.
Using the Capture List
We’re now ready to solve our original problem, which is to write a callable expression
www.it-ebooks.info
Convert pdf to powerpoint slide - C# Create PDF from PowerPoint Library to convert pptx, ppt to PDF in C#.net, ASP.NET MVC, WinForms, WPF
Online C# Tutorial for Creating PDF from Microsoft PowerPoint Presentation
conversion of pdf to ppt online; convert pdf to ppt online
Convert pdf to powerpoint slide - VB.NET Create PDF from PowerPoint Library to convert pptx, ppt to PDF in vb.net, ASP.NET MVC, WinForms, WPF
VB.NET Tutorial for Export PDF file from Microsoft Office PowerPoint
converter pdf to powerpoint; change pdf to ppt
C++ Primer, Fifth Edition
that we can pass to find_if. We want an expression that will compare the length of
each string in the input sequence with the value of the sz parameter in the
biggies function.
Although a lambda may appear inside a function, it can use variables local to that
function 
only
if it specifies which variables it intends to use. A lambda specifies the
variables it will use by including those local variables in its capture list. The capture list
directs the lambda to include information needed to access those variables within the
lambda itself.
In this case, our lambda will capture sz and will have a single string parameter.
The body of our lambda will compare the given string’s size with the captured value
of sz:
Click here to view code image
[sz](const string &a)
{ return a.size() >= sz; };
Inside the [] that begins a lambda we can provide a comma-separated list of names
defined in the surrounding function.
Because this lambda captures sz, the body of the lambda may use sz. The lambda
does not capture words, and so has no access to that variable. Had we given our
lambda an empty capture list, our code would not compile:
Click here to view code image
// error: sz not captured
[](const string &a)
{ return a.size() >= sz; };
Note
A lambda may use a variable local to its surrounding function 
only
if the
lambda captures that variable in its capture list.
Calling 
find_if
Using this lambda, we can find the first element whose size is at least as big as sz:
Click here to view code image
// get an iterator to the first element whose size() is >= sz
auto wc = find_if(words.begin(), words.end(),
[sz](const string &a)
{ return a.size() >= sz; });
The call to find_if returns an iterator to the first element that is at least as long as
www.it-ebooks.info
VB.NET PowerPoint: Read, Edit and Process PPTX File
to convert PowerPoint to PDF, render PowerPoint PowerPoint to TIFF and convert PowerPoint to raster desired watermark on source PowerPoint slide at specified
create powerpoint from pdf; add pdf to powerpoint slide
VB.NET PowerPoint: Process & Manipulate PPT (.pptx) Slide(s)
Suitable for Processing PowerPoint Slide(s) in both Web & SDK, this VB.NET PowerPoint processing control add & profession imaging controls, PDF document, image
how to convert pdf into powerpoint on; how to change pdf to powerpoint on
C++ Primer, Fifth Edition
the given sz, or a copy of words.end() if no such element exists.
We can use the iterator returned from find_if to compute how many elements
appear between that iterator and the end of words (§ 3.4.2, p. 111):
Click here to view code image
// compute the number of elements with size >= sz
auto count = words.end() - wc;
cout << count << " " << make_plural(count, "word", "s")
<< " of length " << sz << " or longer" << endl;
Our output statement calls make_plural (§ 6.3.2, p. 224) to print word or words,
depending on whether that size is equal to 1.
The 
for_each
Algorithm
The last part of our problem is to print the elements in words that have length sz or
greater. To do so, we’ll use the for_each algorithm. This algorithm takes a callable
object and calls that object on each element in the input range:
Click here to view code image
// print words of the given size or longer, each one followed by a space
for_each(wc, words.end(),
[](const string &s){cout << s << " ";});
cout << endl;
The capture list in this lambda is empty, yet the body uses two names: its own
parameter, named s, and cout.
The capture list is empty, because we use the capture list only for (nonstatic)
variables defined in the surrounding function. A lambda can use names that are
defined outside the function in which the lambda appears. In this case, cout is not a
name defined locally in biggies; that name is defined in the iostream header. So
long as the iostream header is included in the scope in which biggies appears, our
lambda can use cout.
Note
The capture list is used for local nonstatic variables only; lambdas can use
local statics and variables declared outside the function directly.
Putting It All Together
Now that we’ve looked at the program in detail, here is the program as a whole:
Click here to view code image
www.it-ebooks.info
C# PowerPoint - How to Process PowerPoint
Visual C# Codes to Process PowerPoint Slide; PowerPoint C#.NET Processor. C#.NET PowerPoint: Process and Edit PowerPoint Slide(s).
how to change pdf to powerpoint; picture from pdf to powerpoint
VB.NET PowerPoint: Read & Scan Barcode Image from PPT Slide
VB.NET PPT PDF-417 barcode scanning SDK to detect PDF-417 barcode image from PowerPoint slide. VB.NET APIs to detect and decode
convert pdf pages to powerpoint slides; pdf to ppt converter online for large
C++ Primer, Fifth Edition
void biggies(vector<string> &words,
vector<string>::size_type sz)
{
elimDups(words); // put words in alphabetical order and remove
duplicates
// sort words by size, but maintain alphabetical order for words of the same size
stable_sort(words.begin(), words.end(),
[](const string &a, const string &b)
{ return a.size() < b.size();});
// get an iterator to the first element whose size() is >= sz
auto wc = find_if(words.begin(), words.end(),
[sz](const string &a)
{ return a.size() >= sz; });
// compute the number of elements with size >= sz
auto count = words.end() - wc;
cout << count << " " << make_plural(count, "word", "s")
<< " of length " << sz << " or longer" << endl;
// print words of the given size or longer, each one followed by a space
for_each(wc, words.end(),
[](const string &s){cout << s << " ";});
cout << endl;
}
Exercises Section 10.3.2
Exercise 10.14: Write a lambda that takes two ints and returns their sum.
Exercise 10.15: Write a lambda that captures an int from its enclosing
function and takes an int parameter. The lambda should return the sum of
the captured int and the int parameter.
Exercise 10.16: Write your own version of the biggies function using
lambdas.
Exercise 10.17: Rewrite exercise 10.12 from § 10.3.1 (p. 387) to use a
lambda in the call to sort instead of the compareIsbn function.
Exercise 10.18: Rewrite biggies to use partition instead of find_if.
We described the partition algorithm in exercise 10.13 in § 10.3.1 (p.
387).
Exercise 10.19: Rewrite the previous exercise to use stable_partition,
which like stable_sort maintains the original element order in the
paritioned sequence.
10.3.3. Lambda Captures and Returns
When we define a lambda, the compiler generates a new (unnamed) class type that
www.it-ebooks.info
VB.NET PowerPoint: Convert & Render PPT into PDF Document
How to Convert PowerPoint Slide to PDF Using VB.NET Code in .NET. What VB.NET APIs can I use to convert PowerPoint slide to PDF document file?
convert pdf to powerpoint slide; pdf to powerpoint slide
VB.NET PowerPoint: Edit PowerPoint Slide; Insert, Add or Delete
To view more VB.NET PowerPoint slide processing functions read VB.NET PPT (.pptx) slide processing guide page & profession imaging controls, PDF document, image
convert pdf into ppt online; convert pdf slides to powerpoint online
C++ Primer, Fifth Edition
corresponds to that lambda. We’ll see how these classes are generated in § 14.8.1 (p.
572). For now, what’s useful to understand is that when we pass a lambda to a
function, we are defining both a new type and an object of that type: The argument is
an unnamed object of this compiler-generated class type. Similarly, when we use
auto to define a variable initialized by a lambda, we are defining an object of the
type generated from that lambda.
By default, the class generated from a lambda contains a data member
corresponding to the variables captured by the lambda. Like the data members of any
class, the data members of a lambda are initialized when a lambda object is created.
Capture by Value
Similar to parameter passing, we can capture variables by value or by reference. Table
10.1 (p. 395) covers the various ways we can form a capture list. So far, our lambdas
have captured variables by value. As with a parameter passed by value, it must be
possible to copy such variables. Unlike parameters, the value of a captured variable is
copied when the lambda is created, not when it is called:
Click here to view code image
void fcn1()
{
size_t v1 = 42;  // local variable
// copies v1 into the callable object named f
auto f = [v1] { return v1; };
v1 = 0;
auto j = f(); // j is 42; f stored a copy of v1 when we created it
}
Table 10.1. Lambda Capture List
www.it-ebooks.info
VB.NET PowerPoint: Extract & Collect PPT Slide(s) Using VB Sample
PowerPoint image insertion, please read this VB.NET PowerPoint slide processing tutorial to provide powerful & profession imaging controls, PDF document, image
how to convert pdf to ppt online; converting pdf to ppt
VB.NET PowerPoint: VB Code to Draw and Create Annotation on PPT
is used to note or comment PowerPoint (.pptx) slide as a kind of compensation for limitations (other documents are compatible, including PDF, TIFF, MS Word and
convert pdf to powerpoint using; changing pdf to powerpoint
C++ Primer, Fifth Edition
Because the value is copied when the lambda is created, subsequent changes to a
captured variable have no effect on the corresponding value inside the lambda.
Capture by Reference
We can also define lambdas that capture variables by reference. For example:
Click here to view code image
void fcn2()
{
size_t v1 = 42;  // local variable
// the object f2 contains a reference to v1
auto f2 = [&v1] { return v1; };
v1 = 0;
auto j = f2(); // j is 0; f2 refers to v1it doesn't store it
}
The & before v1 indicates that v1 should be captured as a reference. A variable
captured by reference acts like any other reference. When we use the variable inside
the lambda body, we are using the object to which that reference is bound. In this
case, when the lambda returns v1, it returns the value of the object to which v1
refers.
Reference captures have the same problems and restrictions as reference returns (§
6.3.2, p. 225). If we capture a variable by reference, we must be 
certain
that the
referenced object exists at the time the lambda is executed. The variables captured by
a lambda are local variables. These variables cease to exist once the function
completes. If it is possible for a lambda to be executed after the function finishes, the
local variables to which the capture refers no longer exist.
www.it-ebooks.info
VB.NET PowerPoint: How to Convert PowerPoint Document to TIFF in
PowerPoint is often used by programmers in many applications formats, such as JPEG, GIF and PDF, by using is designed by our programmers to convert PPT document
convert pdf to editable powerpoint online; how to change pdf to ppt on
VB.NET PowerPoint: Render PowerPoint to REImage for Further
Doc Conversion Library can be used to convert PPT document or image pages, including but not limited to PowerPoint document slide/page, PDF file page and
convert pdf pages into powerpoint slides; embed pdf into powerpoint
C++ Primer, Fifth Edition
Reference captures are sometimes necessary. For example, we might want our
biggies function to take a reference to an ostream on which to write and a
character to use as the separator:
Click here to view code image
void biggies(vector<string> &words,
vector<string>::size_type sz,
ostream &os = cout, char c = ' ')
{
// code to reorder words as before
// statement to print count revised to print to os
for_each(words.begin(), words.end(),
[&os, c](const string &s) { os << s << c; });
}
We cannot copy ostream objects (§ 8.1.1, p. 311); the only way to capture os is by
reference (or through a pointer to os).
When we pass a lambda to a function, as in this call to for_each, the lambda
executes immediately. Capturing os by reference is fine, because the variables in
biggies exist while for_each is running.
We can also return a lambda from a function. The function might directly return a
callable object or the function might return an object of a class that has a callable
object as a data member. If the function returns a lambda, then—for the same
reasons that a function must not return a reference to a local variable—that lambda
must not contain reference captures.
Warning
When we capture a variable by reference, we must ensure that the variable
exists at the time that the lambda executes.
Advice: Keep Your Lambda Captures Simple
A lambda capture stores information between the time the lambda is created
(i.e., when the code that defines the lambda is executed) and the time (or
times) the lambda itself is executed. It is the programmer’s responsibility to
ensure that whatever information is captured has the intended meaning each
time the lambda is executed.
Capturing an ordinary variable—an int, a string, or other nonpointer
type—by value is usually straightforward. In this case, we only need to care
whether the variable has the value we need when we capture it.
If we capture a pointer or iterator, or capture a variable by reference, we
must ensure that the object bound to that iterator, pointer, or reference still
www.it-ebooks.info
C++ Primer, Fifth Edition
exists, whenever the lambda 
executes.
Moreover, we need to ensure that the
object has the intended value. Code that executes between when the lambda
is created and when it executes might change the value of the object to
which the lambda capture points (or refers). The value of the object at the
time the pointer (or reference) was captured might have been what we
wanted. The value of that object when the lambda executes might be quite
different.
As a rule, we can avoid potential problems with captures by minimizing the
data we capture. Moreover, if possible, avoid capturing pointers or
references.
Implicit Captures
Rather than explicitly listing the variables we want to use from the enclosing function,
we can let the compiler infer which variables we use from the code in the lambda’s
body. To direct the compiler to infer the capture list, we use an & or = in the capture
list. The & tells the compiler to capture by reference, and the = says the values are
captured by value. For example, we can rewrite the lambda that we passed to
find_if as
Click here to view code image
// sz implicitly captured by value
wc = find_if(words.begin(), words.end(),
[=](const string &s)
{ return s.size() >= sz; });
If we want to capture some variables by value and others by reference, we can mix
implicit and explicit captures:
Click here to view code image
void biggies(vector<string> &words,
vector<string>::size_type sz,
ostream &os = cout, char c = ' ')
{
// other processing as before
// os implicitly captured by reference; c explicitly captured by value
for_each(words.begin(), words.end(),
[&, c](const string &s) { os << s << c; });
// os explicitly captured by reference; c implicitly captured by value
for_each(words.begin(), words.end(),
[=, &os](const string &s) { os << s << c; });
}
When we mix implicit and explicit captures, the first item in the capture list must be
an & or =. That symbol sets the default capture mode as by reference or by value,
www.it-ebooks.info
C++ Primer, Fifth Edition
respectively.
When we mix implicit and explicit captures, the explicitly captured variables must
use the alternate form. That is, if the implicit capture is by reference (using &), then
the explicitly named variables must be captured by value; hence their names may not
be preceded by an &. Alternatively, if the implicit capture is by value (using =), then
the explicitly named variables must be preceded by an & to indicate that they are to
be captured by reference.
Mutable Lambdas
By default, a lambda may not change the value of a variable that it copies by value. If
we want to be able to change the value of a captured variable, we must follow the
parameter list with the keyword mutable. Lambdas that are mutable may not omit
the parameter list:
Click here to view code image
void fcn3()
{
size_t v1 = 42; // local variable
// f can change the value of the variables it captures
auto f = [v1] () mutable { return ++v1; };
v1 = 0;
auto j = f(); // j is 43
}
Whether a variable captured by reference can be changed (as usual) depends only
on whether that reference refers to a const or nonconst type:
Click here to view code image
void fcn4()
{
size_t v1 = 42;  // local variable
// v1 is a reference to a non const variable
// we can change that variable through the reference inside f2
auto f2 = [&v1] { return ++v1; };
v1 = 0;
auto j = f2(); // j is 1
}
Specifying the Lambda Return Type
The lambdas we’ve written so far contain only a single return statement. As a result,
we haven’t had to specify the return type. By default, if a lambda body contains any
statements other than a return, that lambda is assumed to return void. Like other
functions that return void, lambdas inferred to return void may not return a value.
www.it-ebooks.info
C++ Primer, Fifth Edition
As a simple example, we might use the library transform algorithm and a lambda
to replace each negative value in a sequence with its absolute value:
Click here to view code image
transform(vi.begin(), vi.end(), vi.begin(),
[](int i) { return i < 0 ? -i : i; });
The transform function takes three iterators and a callable. The first two iterators
denote an input sequence and the third is a destination. The algorithm calls the given
callable on each element in the input sequence and writes the result to the
destination. As in this call, the destination iterator can be the same as the iterator
denoting the start of the input. When the input iterator and the destination iterator are
the same, transform replaces each element in the input range with the result of
calling the callable on that element.
In this call, we passed a lambda that returns the absolute value of its parameter.
The lambda body is a single return statement that returns the result of a conditional
expression. We need not specify the return type, because that type can be inferred
from the type of the conditional operator.
However, if we write the seemingly equivalent program using an if statement, our
code won’t compile:
Click here to view code image
// error: cannot deduce the return type for the lambda
transform(vi.begin(), vi.end(), vi.begin(),
[](int i) { if (i < 0) return -i; else return i;
});
This version of our lambda infers the return type as void but we returned a value.
When we need to define a return type for a lambda, we must use a trailing return
type (§ 6.3.3, p. 229):
Click here to view code image
transform(vi.begin(), vi.end(), vi.begin(),
[](int i) -> int
{ if (i < 0) return -i; else return i; });
In this case, the fourth argument to transform is a lambda with an empty capture
list, which takes a single parameter of type int and returns a value of type int. Its
function body is an if statement that returns the absolute value of its parameter.
Exercises Section 10.3.3
Exercise 10.20: The library defines an algorithm named count_if. Like
find_if, this function takes a pair of iterators denoting an input range and
www.it-ebooks.info
Documents you may be interested
Documents you may be interested