C++ Primer, Fifth Edition
istream_iterator
s Are Permitted to Use Lazy Evaluation
When we bind an istream_iterator to a stream, we are not guaranteed that it will
read the stream immediately. The implementation is permitted to delay reading the
stream until we use the iterator. We are guaranteed that before we dereference the
iterator for the first time, the stream will have been read. For most programs, whether
the read is immediate or delayed makes no difference. However, if we create an
istream_iterator that we destroy without using or if we are synchronizing reads
to the same stream from two different objects, then we might care a great deal when
the read happens.
Operations on 
ostream_iterator
s
An ostream_iterator can be defined for any type that has an output operator (the
<< operator). When we create an ostream_iterator, we may (optionally) provide
a second argument that specifies a character string to print following each element.
That string must be a C-style character string (i.e., a string literal or a pointer to a
null-terminated array). We must bind an ostream_iterator to a specific stream.
There is no empty or off-the-end ostream_iterator.
We can use an ostream_iterator to write a sequence of values:
Click here to view code image
ostream_iterator<int> out_iter(cout, " ");
for (auto e : vec)
*out_iter++ = e;  // the assignment writes this element to cout
cout << endl;
This program writes each element from vec onto cout following each element with a
space. Each time we assign a value to out_iter, the write is committed.
It is worth noting that we can omit the dereference and the increment when we
assign to out_iter. That is, we can write this loop equivalently as
Click here to view code image
for (auto e : vec)
out_iter = e;  // the assignment writes this element to cout
cout << endl;
The * and ++ operators do nothing on an ostream_iterator, so omitting them has
no effect on our program. However, we prefer to write the loop as first presented.
That loop uses the iterator consistently with how we use other iterator types. We can
easily change this loop to execute on another iterator type. Moreover, the behavior of
this loop will be clearer to readers of our code.
Rather than writing the loop ourselves, we can more easily print the elements in
www.it-ebooks.info
Convert pdf to powerpoint presentation - 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
how to convert pdf to powerpoint slides; convert pdf slides to powerpoint
Convert pdf to powerpoint presentation - 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
how to convert pdf to ppt using; convert pdf into powerpoint
C++ Primer, Fifth Edition
vec by calling copy:
Click here to view code image
copy(vec.begin(), vec.end(), out_iter);
cout << endl;
Using Stream Iterators with Class Types
We can create an istream_iterator for any type that has an input operator (>>).
Similarly, we can define an ostream_iterator so long as the type has an output
operator (<<). Because Sales_item has both input and output operators, we can
use IO iterators to rewrite the bookstore program from § 1.6 (p. 24):
Click here to view code image
istream_iterator<Sales_item> item_iter(cin), eof;
ostream_iterator<Sales_item> out_iter(cout, "\n");
// store the first transaction in sum and read the next record
Sales_item sum = *item_iter++;
while (item_iter != eof) {
// if the current transaction (which is stored in item_iter) has the same ISBN
if (item_iter->isbn() == sum.isbn())
sum += *item_iter++; // add it to sum and read the next
transaction
else {
out_iter = sum;      // write the current sum
sum = *item_iter++;  // read the next transaction
}
}
out_iter = sum;  // remember to print the last set of records
This program uses item_iter to read Sales_item transactions from cin. It uses
out_iter to write the resulting sums to cout, following each output with a newline.
Having defined our iterators, we use item_iter to initialize sum with the value of
the first transaction:
Click here to view code image
// store the first transaction in sum and read the next record
Sales_item sum = *item_iter++;
Here, we dereference the result of the postfix increment on item_iter. This
expression reads the next transaction, and initializes sum from the value previously
stored in item_iter.
The while loop executes until we hit end-of-file on cin. Inside the while, we check
whether sum and the record we just read refer to the same book. If so, we add the
most recently read Sales_item into sum. If the 
ISBN
s differ, we assign sum to
out_iter, which prints the current value of sum followed by a newline. Having
www.it-ebooks.info
VB.NET PowerPoint: Use PowerPoint SDK to Create, Load and Save PPT
About This SDK. Specifically speaking, this VB.NET PowerPoint presentation document control of RasterEdge .NET Imaging SDK has been developed and provided to
pdf to ppt converter online; converting pdf to powerpoint online
VB.NET PowerPoint: Sort and Reorder PowerPoint Slides by Using VB.
you can choose to show your PPT presentation in inverted clip art or screenshot to PowerPoint document slide & profession imaging controls, PDF document, image
convert pdf to powerpoint online no email; convert pdf to editable powerpoint online
C++ Primer, Fifth Edition
printed the sum for the previous book, we assign sum a copy of the most recently
read transaction and increment the iterator, which reads the next transaction. The
loop continues until an error or end-of-file is encountered. Before exiting, we
remember to print the values associated with the last book in the input.
Exercises Section 10.4.2
Exercise 10.29: Write a program using stream iterators to read a text file
into a vector of strings.
Exercise 10.30: Use stream iterators, sort, and copy to read a sequence
of integers from the standard input, sort them, and then write them back to
the standard output.
Exercise 10.31: Update the program from the previous exercise so that it
prints only the unique elements. Your program should use unqiue_copy (§
10.4.1, p. 403).
Exercise 10.32: Rewrite the bookstore problem from § 1.6 (p. 24) using a
vector to hold the transactions and various algorithms to do the processing.
Use sort with your compareIsbn function from § 10.3.1 (p. 387) to
arrange the transactions in order, and then use find and accumulate to
do the sum.
Exercise 10.33: Write a program that takes the names of an input file and
two output files. The input file should hold integers. Using an
istream_iterator read the input file. Using ostream_iterators, write
the odd numbers into the first output file. Each value should be followed by a
space. Write the even numbers into the second file. Each of these values
should be placed on a separate line.
10.4.3. Reverse Iterators
A reverse iterator is an iterator that traverses a container backward, from the last
element toward the first. A reverse iterator inverts the meaning of increment (and
decrement). Incrementing (++it) a reverse iterator moves the iterator to the previous
element; derementing (--it) moves the iterator to the next element.
The containers, aside from forward_list, all have reverse iterators. We obtain a
reverse iterator by calling the rbegin, rend, crbegin, and crend members. These
members return reverse iterators to the last element in the container and one “past”
(i.e., one before) the beginning of the container. As with ordinary iterators, there are
both const and nonconst reverse iterators.
Figure 10.1 illustrates the relationship between these four iterators on a hypothetical
vector named vec.
www.it-ebooks.info
VB.NET PowerPoint: Merge and Split PowerPoint Document(s) with PPT
individual slide is with the virtual presentation of PPTXPage in VB.NET to finish PowerPoint document splitting If you want to see more PDF processing functions
change pdf to powerpoint on; how to convert pdf into powerpoint
C# Create PDF from OpenOffice to convert odt, odp files to PDF in
using RasterEdge.XDoc.Excel; using RasterEdge.XDoc.PowerPoint; How to Use C#.NET Demo Code to Convert ODT to PDF in C#.NET Project.
how to convert pdf to powerpoint; converting pdf to ppt online
C++ Primer, Fifth Edition
Figure 10.1. Comparing begin/cend and rbegin/crend Iterators
As an example, the following loop prints the elements of vec in reverse order:
Click here to view code image
vector<int> vec = {0,1,2,3,4,5,6,7,8,9};
// reverse iterator of vector from back to front
for (auto r_iter = vec.crbegin(); // binds r_iter to the last element
r_iter != vec.crend();  // crend refers 1 before 1st element
++r_iter)               // decrements the iterator one
element
cout << *r_iter << endl;      // prints 9, 8, 7,... 0
Although it may seem confusing to have the meaning of the increment and
decrement operators reversed, doing so lets us use the algorithms transparently to
process a container forward or backward. For example, we can sort our vector in
descending order by passing sort a pair of reverse iterators:
Click here to view code image
sort(vec.begin(), vec.end()); // sorts vec in ''normal'' order
// sorts in reverse: puts the smallest element at the end of vec
sort(vec.rbegin(), vec.rend());
Reverse Iterators Require Decrement Operators
Not surprisingly, we can define a reverse iterator only from an iterator that supports -
- as well as ++. After all, the purpose of a reverse iterator is to move the iterator
backward through the sequence. Aside from forward_list, the iterators on the
standard containers all support decrement as well as increment. However, the stream
iterators do not, because it is not possible to move backward through a stream.
Therefore, it is not possible to create a reverse iterator from a forward_list or a
stream iterator.
Relationship between Reverse Iterators and Other Iterators
Suppose we have a string named line that contains a comma-separated list of
www.it-ebooks.info
C# PDF Text Extract Library: extract text content from PDF file in
But sometimes, we need to extract or fetch text content from source PDF document file for word processing, presentation and desktop publishing applications.
convert pdf to ppt online; converter pdf to powerpoint
VB.NET PowerPoint: VB Codes to Create Linear and 2D Barcodes on
2d barcodes of different types on PowerPoint presentation when you Here is a market-leading PowerPoint barcode add 2d barcodes QR Code, Data Matrix, PDF-417,
how to change pdf file to powerpoint; change pdf to powerpoint online
C++ Primer, Fifth Edition
words, and we want to print the first word in line. Using find, this task is easy:
Click here to view code image
// find the first element in a comma-separated list
auto comma = find(line.cbegin(), line.cend(), ',');
cout << string(line.cbegin(), comma) << endl;
If there is a comma in line, then comma refers to that comma; otherwise it is
line.cend(). When we print the string from line.cbegin() to comma, we
print characters up to the comma, or the entire string if there is no comma.
If we wanted the last word, we can use reverse iterators instead:
Click here to view code image
// find the last element in a comma-separated list
auto rcomma = find(line.crbegin(), line.crend(), ',');
Because we pass crbegin() and crend(), this call starts with the last character in
line and searches backward. When find completes, if there is a comma, then
rcomma refers to the last comma in the line—that is, it refers to the first comma
found in the backward search. If there is no comma, then rcomma is line.crend().
The interesting part comes when we try to print the word we found. The seemingly
obvious way
Click here to view code image
// WRONG: will generate the word in reverse order
cout << string(line.crbegin(), rcomma) << endl;
generates bogus output. For example, had our input been
FIRST,MIDDLE,LAST
then this statement would print TSAL!
Figure 10.2 illustrates the problem: We are using reverse iterators, which process
the string backward. Therefore, our output statement prints from crbegin
backward through line. Instead, we want to print from rcomma forward to the end
of line. However, we can’t use rcomma directly. That iterator is a reverse iterator,
which means that it goes backward toward the beginning of the string. What we
need to do is transform rcomma back into an ordinary iterator that will go forward
through line. We can do so by calling the reverse_iterator’s base member,
which gives us its corresponding ordinary iterator:
Click here to view code image
// ok: get a forward iterator and read to the end of line
cout << string(rcomma.base(), line.cend()) << endl;
www.it-ebooks.info
VB.NET Create PDF from OpenOffice to convert odt, odp files to PDF
using RasterEdge.XDoc.Word; using RasterEdge.XDoc.Excel; using RasterEdge.XDoc.PowerPoint; How to VB.NET: Convert ODT to PDF.
how to change pdf to powerpoint format; convert pdf pages into powerpoint slides
VB.NET PowerPoint: Add Image to PowerPoint Document Slide/Page
image or clip art to your PowerPoint presentation in VB insert or delete any certain PowerPoint slide without & profession imaging controls, PDF document, tiff
how to convert pdf to ppt online; convert pdf to editable ppt online
C++ Primer, Fifth Edition
Figure 10.2. Relationship between Reverse and Ordinary Iterators
Given the same preceding input, this statement prints LAST as expected.
The objects shown in Figure 10.2 illustrate the relationship between ordinary and
reverse iterators. For example, rcomma and rcomma.base() refer to different
elements, as do line.crbegin() and line.cend(). These differences are needed
to ensure that the 
range
of elements, whether processed forward or backward, is the
same.
Technically speaking, the relationship between normal and reverse iterators
accommodates the properties of a left-inclusive range (§ 9.2.1, p. 331). The point is
that [line.crbegin(), rcomma) and [rcomma.base(), line.cend()) refer
to the same elements in line. In order for that to happen, rcomma and
rcomma.base() must yield adjacent positions, rather than the same position, as
must crbegin() and cend().
Note
The fact that reverse iterators are intended to represent ranges and that
these ranges are asymmetric has an important consequence: When we
initialize or assign a reverse iterator from a plain iterator, the resulting
iterator does not refer to the same element as the original.
Exercises Section 10.4.3
Exercise 10.34: Use reverse_iterators to print a vector in reverse
order.
Exercise 10.35: Now print the elements in reverse order using ordinary
iterators.
Exercise 10.36: Use find to find the last element in a list of ints with
value 0.
Exercise 10.37: Given a vector that has ten elements, copy the elements
from positions 3 through 7 in reverse order to a list.
www.it-ebooks.info
C++ Primer, Fifth Edition
10.5. Structure of Generic Algorithms
The most fundamental property of any algorithm is the list of operations it requires
from its iterator(s). Some algorithms, such as find, require only the ability to access
an element through the iterator, to increment the iterator, and to compare two
iterators for equality. Others, such as sort, require the ability to read, write, and
randomly access elements. The iterator operations required by the algorithms are
grouped into five iterator categories listed in Table 10.5. Each algorithm specifies
what kind of iterator must be supplied for each of its iterator parameters.
Table 10.5. Iterator Categories
A second way is to classify the algorithms (as we did in the beginning of this
chapter) is by whether they read, write, or reorder the elements in the sequence.
Appendix A covers all the algorithms according to this classification.
The algorithms also share a set of parameter-passing conventions and a set of
naming conventions, which we shall cover after looking at iterator categories.
10.5.1. The Five Iterator Categories
Like the containers, iterators define a common set of operations. Some operations are
provided by all iterators; other operations are supported by only specific kinds of
iterators. For example, ostream_iterators have only increment, dereference, and
assignment. Iterators on vector, strings, and deques support these operations
and the decrement, relational, and arithmetic operators.
Iterators are categorized by the operations they provide and the categories form a
sort of hierarchy. With the exception of output iterators, an iterator of a higher
category provides all the operations of the iterators of a lower categories.
The standard specifies the minimum category for each iterator parameter of the
generic and numeric algorithms. For example, find—which implements a one-pass,
read-only traversal over a sequence—minimally requires an input iterator. The
replace function requires a pair of iterators that are at least forward iterators.
Similarly, replace_copy requires forward iterators for its first two iterators. Its third
iterator, which represents a destination, must be at least an output iterator, and so
www.it-ebooks.info
C++ Primer, Fifth Edition
on. For each parameter, the iterator must be at least as powerful as the stipulated
minimum. Passing an iterator of a lesser power is an error.
Warning
Many compilers will not complain when we pass the wrong category of
iterator to an algorithm.
The Iterator Categories
Input iterators: can read elements in a sequence. An input iterator must provide
• Equality and inequality operators (==, !=) to compare two iterators
• Prefix and postfix increment (++) to advance the iterator
• Dereference operator (*) to read an element; dereference may appear only on
the right-hand side of an assignment
• The arrow operator (->) as a synonym for (* it).member—that is,
dereference the iterator and fetch a member from the underlying object
Input iterators may be used only sequentially. We are guaranteed that *it++ is valid,
but incrementing an input iterator may invalidate all other iterators into the stream. As
a result, there is no guarantee that we can save the state of an input iterator and
examine an element through that saved iterator. Input iterators, therefore, may be
used only for single-pass algorithms. The find and accumulate algorithms require
input iterators; istream_iterators are input iterators.
Output iterators: can be thought of as having complementary functionality to input
iterators; they write rather than read elements. Output iterators must provide
• Prefix and postfix increment (++) to advance the iterator
• Dereference (*), which may appear only as the left-hand side of an assignment
(Assigning to a dereferenced output iterator writes to the underlying element.)
We may assign to a given value of an output iterator only once. Like input iterators,
output iterators may be used only for single-pass algorithms. Iterators used as a
destination are typically output iterators. For example, the third parameter to copy is
an output iterator. The ostream_iterator type is an output iterator.
Forward iterators: can read and write a given sequence. They move in only one
direction through the sequence. Forward iterators support all the operations of both
input iterators and output iterators. Moreover, they can read or write the same
element multiple times. Therefore, we can use the saved state of a forward iterator.
Hence, algorithms that use forward iterators may make multiple passes through the
sequence. The replace algorithm requires a forward iterator; iterators on
forward_list are forward iterators.
www.it-ebooks.info
C++ Primer, Fifth Edition
Bidirectional iterators: can read and write a sequence forward or backward. In
addition to supporting all the operations of a forward iterator, a bidirectional iterator
also supports the prefix and postfix decrement (--) operators. The reverse
algorithm requires bidirectional iterators, and aside from forward_list, the library
containers supply iterators that meet the requirements for a bidirectional iterator.
Random-access iterators: provide constant-time access to any position in the
sequence. These iterators support all the functionality of bidirectional iterators. In
addition, random-access iterators support the operations from Table 3.7 (p. 111):
• The relational operators (<, <=, >, and >=) to compare the relative positions of
two iterators.
• Addition and subtraction operators (+, +=, -, and -=) on an iterator and an
integral value. The result is the iterator advanced (or retreated) the integral
number of elements within the sequence.
• The subtraction operator (-) when applied to two iterators, which yields the
distance between two iterators.
• The subscript operator (iter[n]) as a synonym for * (iter + n).
The sort algorithms require random-access iterators. Iterators for array, deque,
string, and vector are random-access iterators, as are pointers when used to
access elements of a built-in array.
Exercises Section 10.5.1
Exercise 10.38: List the five iterator categories and the operations that each
supports.
Exercise 10.39: What kind of iterator does a list have? What about a
vector?
Exercise 10.40: What kinds of iterators do you think copy requires? What
about reverse or unique?
10.5.2. Algorithm Parameter Patterns
Superimposed on any other classification of the algorithms is a set of parameter
conventions. Understanding these parameter conventions can aid in learning new
algorithms—by knowing what the parameters mean, you can concentrate on
understanding the operation the algorithm performs. Most of the algorithms have one
of the following four forms:
Click here to view code image
alg(beg, end, other args);
www.it-ebooks.info
C++ Primer, Fifth Edition
alg(beg, end, dest, other args);
alg(beg, end, beg2, other args);
alg(beg, end, beg2, end2, other args);
where 
alg
is the name of the algorithm, and beg and end denote the input range on
which the algorithm operates. Although nearly all algorithms take an input range, the
presence of the other parameters depends on the work being performed. The
common ones listed here—dest, beg2, and end2—are all iterators. When used,
these iterators fill similar roles. In addition to these iterator parameters, some
algorithms take additional, noniterator parameters that are algorithm specific.
Algorithms with a Single Destination Iterator
A dest parameter is an iterator that denotes a destination in which the algorithm can
write its output. Algorithms 
assume
that it is safe to write as many elements as
needed.
Warning
Algorithms that write to an output iterator assume the destination is large
enough to hold the output.
If dest is an iterator that refers directly to a container, then the algorithm writes its
output to existing elements within the container. More commonly, dest is bound to
an insert iterator (§ 10.4.1, p. 401) or an ostream_iterator (§ 10.4.2, p. 403). An
insert iterator adds new elements to the container, thereby ensuring that there is
enough space. An ostream_iterator writes to an output stream, again presenting
no problem regardless of how many elements are written.
Algorithms with a Second Input Sequence
Algorithms that take either beg2 alone or beg2 and end2 use those iterators to
denote a second input range. These algorithms typically use the elements from the
second range in combination with the input range to perform a computation.
When an algorithm takes both beg2 and end2, these iterators denote a second
range. Such algorithms take two completely specified ranges: the input range denoted
by [beg, end), and a second input range denoted by [beg2, end2).
Algorithms that take only beg2 (and not end2) treat beg2 as the first element in a
second input range. The end of this range is not specified. Instead, these algorithms
assume
that the range starting at beg2 is at least as large as the one denoted by
beg, end.
www.it-ebooks.info
Documents you may be interested
Documents you may be interested