accumulate
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
accumulate - Accumulate all elements within a range into a single
value.
SYNOPSIS
#include <numeric>
template <class InputIterator, class T>
T accumulate (InputIterator first,
InputIterator last,
T init);
template <class InputIterator,
class T,
class BinaryOperation>
T accumulate (InputIterator first,
InputIterator last,
T init,
BinaryOperation binary_op);
DESCRIPTION
accumulate applies a binary operation to init and each value in the
range [first,last). The result of each operation is returned in
init. This process aggregates the result of performing the
operation on every element of the sequence into a single value.
Accumulation is done by initializing the accumulator acc with the
initial value init and then modifying it with acc = acc + *i or acc
= binary_op(acc, *i) for every iterator i in the range [first,
last) in order. If the sequence is empty, accumulate returns init.
COMPLEXITY
accumulate performs exactly last-first applications of the binary
operation (operator+ by default).
EXAMPLE
//
// accum.cpp
//
#include <numeric> //for accumulate
#include <vector> //for vector
#include <functional> //for times
#include <iostream.h>
int main()
{
//
//Typedef for vector iterators
//
typedef vector<int>::iterator iterator;
//
//Initialize a vector using an array of ints
//
int d1[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> v1(d1, d1+10);
//
//Accumulate sums and products
//
int sum = accumulate(v1.begin(), v1.end(), 0);
int prod = accumulate(v1.begin(), v1.end(),
1, times<int>());
//
//Output the results
//
cout << "For the series: ";
for(iterator i = v1.begin(); i != v1.end(); i++)
cout << *i << " ";
cout << " where N = 10." << endl;
cout << "The sum = (N*N + N)/2 = " << sum << endl;
cout << "The product = N! = " << prod << endl;
return 0;
}
Output :
For the series: 1 2 3 4 5 6 7 8 9 10 where N = 10.
The sum = (N*N + N)/2 = 55
The product = N! = 3628800
WARNINGS
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int,allocator<int> >
instead of:
vector<int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
adjacent_difference
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
adjacent_difference - Outputs a sequence of the differences between
each adjacent pair of elements in a range.
SYNOPSIS
#include <numeric>
template <class InputIterator, class OutputIterator>
OutputIterator adjacent_difference (InputIterator first,
InputIterator last,
OutputIterator result);
template <class InputIterator,
class OutputIterator,
class BinaryOperation>
OutputIterator adjacent_difference (InputIterator first,
InputIterator last,
OutputIterator result,
BinaryOperation bin_op);
DESCRIPTION
Informally, adjacent_difference fills a sequence with the
differences between successive elements in a container. The result
is a sequence in which the first element is equal to the
first element of the sequence being processed, and the remaining
elements are equal to the calculated differences between
adjacent elements. For instance, applying adjacent_difference
to {1,2,3,5} will produce a result of {1,1,1,2}.
By default, subtraction is used to compute the difference, but you
can supply any binary operator. The binary operator is then applied
to adjacent elements. For example, by supplying the plus (+)
operator, the result of applying adjacent_difference to {1,2,3,5} is
the sequence {1,3,5,8}.
Formally, adjacent_difference assigns to every element referred to
by iterator i in the range [result + 1, result + (last -
first)) a value equal to the appropriate one of the
following:
*(first + (i - result)) - *(first + (i - result) - 1)
or
binary_op (*(first + (i - result)), *(first + (i - result) - 1))
result is assigned the value of *first.
adjacent_difference returns result + (last - first).
result can be equal to first. This allows you to place the results
of applying adjacent_difference into the original sequence.
COMPLEXITY
This algorithm performs exactly (last-first) - 1 applications of the
default operation (-) or binary_op.
EXAMPLE
//
// adj_diff.cpp
//
#include<numeric> //For adjacent_difference
#include<vector> //For vector
#include<functional> //For times
#include <iostream.h>
int main()
{
//
//Initialize a vector of ints from an array
//
int arr[10] = {1,1,2,3,5,8,13,21,34,55};
vector<int> v(arr,arr+10);
//
//Two uninitialized vectors for storing results
//
vector<int> diffs(10), prods(10);
//
//Calculate difference(s) using default operator (minus)
//
adjacent_difference(v.begin(),v.end(),diffs.begin());
//
//Calculate difference(s) using the times operator
//
adjacent_difference(v.begin(), v.end(), prods.begin(),
times<int>());
//
//Output the results
//
cout << "For the vector: " << endl << " ";
copy(v.begin(),v.end(),
ostream_iterator<int,char>(cout," "));
cout << endl << endl;
cout << "The differences between adjacent elements are: "
<< endl << " ";
copy(diffs.begin(),diffs.end(),
ostream_iterator<int,char>(cout," "));
cout << endl << endl;
cout << "The products of adjacent elements are: "
<< endl << " ";
copy(prods.begin(),prods.end(),
ostream_iterator<int,char>(cout," "));
cout << endl;
return 0;
Output :
For the vector:
1 1 2 3 5 8 13 21 34 55
The differences between adjacent elements are:
1 0 1 1 2 3 5 8 13 21
The products of adjacent elements are:
1 1 2 6 15 40 104 273 714 1870
WARNING
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int,allocator<int> >
instead of:
vector<int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
adjacent_find
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
adjacent_find - Find the first adjacent pair of elements in a
sequence that are equivalent.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator>
ForwardIterator
adjacent_find(ForwardIterator first, ForwardIterator last);
template <class ForwardIterator, class BinaryPredicate>
ForwardIterator
adjacent_find(ForwardIterator first, ForwardIterator last,
BinaryPredicate pred);
DESCRIPTION
There are two versions of the adjacent_find algorithm. The first
finds equal adjacent elements in the sequence defined by iterators
first and last and returns an iterator i pointing to the first of
the equal elements. The second version lets you specify your own
binary function to test for a condition. It returns an iterator i
pointing to the first of the pair of elements that meet the
conditions of the binary function. In other words,
adjacent_find returns the first iterator i such that both i and i
+ 1 are in the range [first, last) for which one of the following
conditions holds:
*i == *(i + 1)
or
pred(*i,*(i + 1)) == true
If adjacent_find does not find a match, it returns last.
COMPLEXITY
adjacent_find performs exactly find(first,last,value) - first
applications of the corresponding predicate.
EXAMPLE
//
// find.cpp
//
#include <vector>
#include <algorithm>
#include <iostream.h>
int main()
{
typedef vector<int>::iterator iterator;
int d1[10] = {0,1,2,2,3,4,2,2,6,7};
// Set up a vector
vector<int> v1(d1,d1 + 10);
// Try find
iterator it1 = find(v1.begin(),v1.end(),3);
// Try find_if
iterator it2 =
find_if(v1.begin(),v1.end(),bind1st(equal_to<int>(),3));
// Try both adjacent_find variants
iterator it3 = adjacent_find(v1.begin(),v1.end());
iterator it4 =
adjacent_find(v1.begin(),v1.end(),equal_to<int>());
// Output results
cout << *it1 << " " << *it2 << " " << *it3 << " "
<< *it4 << endl;
return 0;
}
Output :
3 3 2 2
WARNING
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int,allocator<int> > instead of:
vector<int>
SEE ALSO
find
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
advance
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
advance - Move an iterator forward or backward (if available) by a
certain distance.
SYNOPSIS
#include <iterator>
template <class InputIterator, class Distance>
void advance (InputIterator& i, Distance n);
DESCRIPTION
The advance template function allows an iterator to be advanced
through a container by some arbitrary distance. For
bidirectional and random access iterators, this distance may be
negative. This function uses operator+ and operator- for
random access iterators, which provides a constant time
implementation. For input, forward, and bidirectional iterators,
advance uses operator++ to provide linear time implementations.
advance also uses operator-- with bidirectional iterators to
provide linear time implementations of negative distances.
If n is positive, advance increments iterator reference i by n. For
negative n, advance decrements reference i. Remember that advance
accepts a negative argument n for random access and
bidirectional iterators only.
EXAMPLE
//
// advance.cpp
//
#include<iterator>
#include<list>
#include<iostream.h>
int main()
{
//
//Initialize a list using an array
//
int arr[6] = {3,4,5,6,7,8};
list<int> l(arr,arr+6);
//
//Declare a list iterator, s.b. a ForwardIterator
//
list<int>::iterator itr = l.begin();
//
//Output the original list
//
cout << "For the list: ";
copy(l.begin(),l.end(),
ostream_iterator<int,char>(cout," "));
cout << endl << endl;
cout << "When the iterator is initialized to l.begin(),"
<< endl << "it points to " << *itr << endl << endl;
//
// operator+ is not available for a ForwardIterator,
// so use advance.
//
advance(itr, 4);
cout << "After advance(itr,4), the iterator points to "
<< *itr << endl;
return 0;
}
Output :
For the list: 3 4 5 6 7 8
When the iterator is initialized to l.begin(),
it points to 3
After advance(itr,4), the iterator points to 7
WARNINGS
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int,allocator<int> >
instead of:
vector<int>
SEE ALSO
sequence, random_iterator, distance
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
binary_search
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
binary_search - Performs a binary search for a value on a container.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator, class T>
bool
binary_search(ForwardIterator first, ForwardIterator last,
const T& value);
template <class ForwardIterator, class T, class Compare>
bool
binary_search(ForwardIterator first, ForwardIterator last,
const T& value, Compare comp);
DESCRIPTION
The binary_search algorithm, like other related algorithms
(equal_range, lower_bound and upper_bound) performs a binary
search on ordered containers. All binary search
algorithms have two versions. The first version uses the less
than operator (operator<) to perform the comparison, and assumes
that the sequence has been sorted using that operator. The second
version allows you to include a function object of type Compare,
which it assumes was the function used to sort the sequence.
The function object must be a binary predicate.
The binary_search algorithm returns true if a sequence contains an
element equivalent to the argument value. The first version of
binary_search returns true if the sequence contains at least one
element that is equal to the search value. The second
version of the binary_search algorithm returns true if the
sequence contains at least one element that satisfies the
conditions of the comparison function. Formally,
binary_search returns true if there is an iterator i in the
range [first, last) that satisfies the corresponding conditions:
!(*i < value) && !(value < *i)
or
comp(*i, value) == false && comp(value, *i) == false
COMPLEXITY
binary_search performs at most log(last - first) + 2 comparisons.
EXAMPLE
//
// b_search.cpp
//
#include <vector>
#include <algorithm>
#include <iostream.h>
int main()
{
typedef vector<int>::iterator iterator;
int d1[10] = {0,1,2,2,3,4,2,2,6,7};
//
// Set up a vector
//
vector<int> v1(d1,d1 + 10);
//
// Try binary_search variants
//
sort(v1.begin(),v1.end());
bool b1 = binary_search(v1.begin(),v1.end(),3);
bool b2 =
binary_search(v1.begin(),v1.end(),11,less<int>());
//
// Output results
//
cout << "In the vector: ";
copy(v1.begin(),v1.end(),
ostream_iterator<int,char>(cout," "));
cout << endl << "The number 3 was "
<< (b1 ? "FOUND" : "NOT FOUND");
cout << endl << "The number 11 was "
<< (b2 ? "FOUND" : "NOT FOUND") << endl;
return 0;
}
Output :
In the vector: 0 1 2 2 2 2 3 4 6 7
The number 3 was FOUND
The number 11 was NOT FOUND
WARNINGS
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you'll have to write:
vector<int,allocator<int> >
instead of:
vector<int>
SEE ALSO
equal_range, lower_bound, upper_bound
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
copy
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
copy, copy_backward - Copies a range of elements
SYNOPSIS
#include <algorithm>
template <class InputIterator, class OutputIterator>
OutputIterator copy(InputIterator first, InputIterator last,
OutputIterator result);
template <class BidirectionalIterator1, class BidirectionalIterator2>
BidirectionalIterator2 copy_backward(BidirectionalIterator1 first,
BidirectionalIterator1 last,
BidirectionalIterator2 result);
DESCRIPTION
The copy algorithm copies values from the range specified by [first
, last) to the range that specified by [result, result + (last
- first)). copy can be used to copy values from one container to
another, or to copy values from one location in a container to
another location in the same container, as long as result is not
within the range [first-last). copy returns result + (last - first).
For each non-negative integer n < (last - first), copy assigns
*(first + n) to *(result + n). The result of copy is
undefined if result is in the range [first, last).
Unless result is an insert iterator, copy assumes that at least as
many elements follow result as are in the range [first, last).
The copy_backward algorithm copies elements in the range specified
by [first, last) into the range specified by [result - (last -
first), result), starting from the end of the sequence (last-1) and
progressing to the front (first). Note that copy_backward does not
reverse the order of the elements, it simply reverses the order
of transfer. copy_backward returns result - (last - first). You
should use copy_backward instead of copy when last is in the
range [result - (last - first), result). For each positive integer
n <= (last - first), copy_backward assigns *(last - n) to
*(result - n). The result of copy_backward is undefined if
result is in the range [first, last).
Unless result is an insert iterator, copy_backward assumes that
there are at least as many elements ahead of result as are in the
range [first, last).
COMPLEXITY
Both copy and copy_backward perform exactly last - first assignments.
EXAMPLE
//
// stdlib/examples/manual.copyex.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main()
{
int d1[4] = {1,2,3,4};
int d2[4] = {5,6,7,8};
// Set up three vectors
//
vector<int> v1(d1,d1 + 4), v2(d2,d2 + 4), v3(d2,d2 + 4);
//
// Set up one empty vector
//
vector<int> v4;
//
// Copy v1 to v2
//
copy(v1.begin(),v1.end(),v2.begin());
//
// Copy backwards v1 to v3
//
copy_backward(v1.begin(),v1.end(),v3.end());
//
// Use insert iterator to copy into empty vector
//
copy(v1.begin(),v1.end(),back_inserter(v4));
//
// Copy all four to cout
//
ostream_iterator<int,char> out(cout," ");
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
copy(v3.begin(),v3.end(),out);
cout << endl;
copy(v4.begin(),v4.end(),out);
cout << endl;
return 0;
}
Output :
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
WARNING
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector <int, allocator<int> >
instead of:
vector <int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
copy_backward
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
copy, copy_backward - Copies a range of elements
SYNOPSIS
#include <algorithm>
template <class InputIterator, class OutputIterator>
OutputIterator copy(InputIterator first, InputIterator last,
OutputIterator result);
template <class BidirectionalIterator1, class BidirectionalIterator2>
BidirectionalIterator2 copy_backward(BidirectionalIterator1 first,
BidirectionalIterator1 last,
BidirectionalIterator2 result);
DESCRIPTION
The copy algorithm copies values from the range specified by [first
, last) to the range that specified by [result, result + (last
- first)). copy can be used to copy values from one container to
another, or to copy values from one location in a container to
another location in the same container, as long as result is not
within the range [first-last). copy returns result + (last - first).
For each non-negative integer n < (last - first), copy assigns
*(first + n) to *(result + n). The result of copy is undefined if
result is in the range [first, last).
Unless result is an insert iterator, copy assumes that at least as
many elements follow result as are in the range [first, last).
The copy_backward algorithm copies elements in the range specified
by [first, last) into the range specified by [result - (last -
first), result), starting from the end of the sequence (last-1) and
progressing to the front (first). Note that copy_backward does not
reverse the order of the elements, it simply reverses the order
of transfer. copy_backward returns result - (last - first). You
should use copy_backward instead of copy when last is in the
range [result - (last - first), result). For each positive integer
n <= (last - first), copy_backward assigns *(last - n) to
*(result - n). The result of copy_backward is undefined if
result is in the range [first, last).
Unless result is an insert iterator, copy_backward assumes that
there are at least as many elements ahead of result as are in the
range [first,last).
COMPLEXITY
Both copy and copy_backward perform exactly last - first
assignments.
//
EXAMPLE
// stdlib/examples/manual.copyex.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main()
{
int d1[4] = {1,2,3,4};
int d2[4] = {5,6,7,8};
// Set up three vectors
//
vector<int> v1(d1,d1 + 4), v2(d2,d2 + 4), v3(d2,d2 + 4);
//
// Set up one empty vector
//
vector<int> v4;
//
// Copy v1 to v2
//
copy(v1.begin(),v1.end(),v2.begin());
//
// Copy backwards v1 to v3
//
copy_backward(v1.begin(),v1.end(),v3.end());
//
// Use insert iterator to copy into empty vector
//
copy(v1.begin(),v1.end(),back_inserter(v4));
//
// Copy all four to cout
//
ostream_iterator<int,char> out(cout," ");
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
copy(v3.begin(),v3.end(),out);
cout << endl;
copy(v4.begin(),v4.end(),out);
cout << endl;
return 0;
}
Output :
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
WARNING
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector <int, allocator<int> >
instead of:
vector <int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
count
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
count, count_if - Count the number of elements in a container that
satisfy a given condition.
SYNOPSIS
#include <algorithm>
template<class InputIterator, class T>
iterator_trait<InputIterator>::distance_type
count(InputIterator first, InputIterator last,
const T& value);
template <class InputIterator, class T, class Size>
void count(InputIterator first, InputIterator last,
const T& value, Size& n);
template<class InputIterator, class Predicate>
iterator_trait<InputIterator>::distance_type
count_if(InputIterator first, InputIterator last,
Predicate pred);
template <class InputIterator, class Predicate, class Size>
void count_if(InputIterator first, InputIterator last,
Predicate pred, Size& n);
DESCRIPTION
The count algorithm compares value to elements in the sequence
defined by iterators first and last. The first version of count
return the number of matches. The second version
increments a counting value n each time it finds a match.
i.e., count returns (or adds to n) the number of iterators i in
the range [first, last) for which the following condition holds:
*i == value
COMPLEXITY
The count_if algorithm lets you specify a predicate, and returns the
number of times an element in the sequence satisfies the predicate
(or increments n that number of times). That is, count_if returns
(or adds to n) the number of iterators i in the range [first,
last) for which the following condition holds:
pred(*i) == true. Both count and count_if perform exactly
last-first applications of the corresponding predicate.
EXAMPLE
//
// count.cpp
//
// Does not demonstrate the partial specialization versions
// of count and count_if
//
#include <vector>
#include <algorithm>
#include <iostream.h>
int main()
{
int sequence[10] = {1,2,3,4,5,5,7,8,9,10};
int i=0,j=0,k=0;
//
// Set up a vector
//
vector<int> v(sequence,sequence + 10);
count(v.begin(),v.end(),5,i); // Count fives
count(v.begin(),v.end(),6,j); // Count sixes
//
// Count all less than 8
// I=2, j=0
//
count_if(v.begin(),v.end(),bind2nd(less<int>(),8),k);
// k = 7
cout << i << " " << j << " " << k << endl;
return 0;
}
Output : 2 0 7
WARNINGS
If your compiler does not support partial specialization then the
first version of both count and count_if (the one that returns the
count) will not be available.
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance, you'll have to write:
vector <int, allocator<int> >
instead of:
vector <int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
count_if
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
count, count_if - Count the number of elements in a container that
satisfy a given condition.
SYNOPSIS
#include <algorithm>
template<class InputIterator, class T>
iterator_trait<InputIterator>::distance_type
count(InputIterator first, InputIterator last,
const T& value);
template <class InputIterator, class T, class Size>
void count(InputIterator first, InputIterator last,
const T& value, Size& n);
template<class InputIterator, class Predicate>
iterator_trait<InputIterator>::distance_type
count_if(InputIterator first, InputIterator last,
Predicate pred);
template <class InputIterator, class Predicate, class Size>
void count_if(InputIterator first, InputIterator last,
Predicate pred, Size& n);
DESCRIPTION
The count algorithm compares value to elements in the sequence
defined by iterators first and last. The first version of count
return the number of matches. The second version
increments a counting value n each time it finds a match.
i.e., count returns (or adds to n) the number of iterators i in
the range [first, last) for which the following condition holds:
*i == value
COMPLEXITY
The count_if algorithm lets you specify a predicate, and returns the
number of times an element in the sequence satisfies the predicate
(or increments n that number of times). That is, count_if returns
(or adds to n) the number of iterators i in the range [first,
last) for which the following condition holds:
pred(*i) == true. Both count and count_if perform exactly
last-first applications of the corresponding predicate.
EXAMPLE
//
// count.cpp
//
// Does not demonstrate the partial specialization versions
// of count and count_if
//
#include <vector>
#include <algorithm>
#include <iostream.h>
int main()
{
int sequence[10] = {1,2,3,4,5,5,7,8,9,10};
int i=0,j=0,k=0;
//
// Set up a vector
//
vector<int> v(sequence,sequence + 10);
count(v.begin(),v.end(),5,i); // Count fives
count(v.begin(),v.end(),6,j); // Count sixes
//
// Count all less than 8
// I=2, j=0
//
count_if(v.begin(),v.end(),bind2nd(less<int>(),8),k);
// k = 7
cout << i << " " << j << " " << k << endl;
return 0;
}
Output : 2 0 7
WARNINGS
If your compiler does not support partial specialization then the
first version of both count and count_if (the one that returns the
count) will not be available.
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance, you'll have to write:
vector <int, allocator<int> >
instead of:
vector <int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
compare
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
compare - A binary function or a function object that returns true
or false. compare objects are typically passed as template
parameters, and used for ordering elements within a container.
SEE ALSO
binary_function, function object
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
distance
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
distance - Computes the distance between two iterators
SYNOPSIS
#include <iterator>
template <class ForwardIterator>
iterator_traits<ForwardIterator>::distance_type
distance (ForwardIterator first,
ForwardIterator last);
template <class ForwardIterator, class Distance>
void distance (ForwardIterator first,
ForwardIterator last,
Distance& n);
DESCRIPTION
The distance template function computes the distance between two
iterator. The first version returns that value, while the
second version increments n by that value. The last iterator must
be reachable from the first iterator.
Note that the second version of this function is obsolete. It is
provided for backward compatibility and to support compilers that do
not provide partial specialization. As you may have already
deduced, the first version of the function is not available with
compilers that do not support partial specialization since it
depends on iterator_traits, which itself depends on that particular
language feature.
EXAMPLE
//
// distance.cpp
//
#include <iterator>
#include <vector>
#include <iostream.h>
int main()
{
//
//Initialize a vector using an array
//
int arr[6] = {3,4,5,6,7,8};
vector<int> v(arr,arr+6);
//
//Declare a list iterator, s.b. a ForwardIterator
//
vector<int>::iterator itr = v.begin()+3;
//
//Output the original vector
//
cout << "For the vector: ";
copy(v.begin(),v.end(),
ostream_iterator<int,char>(cout," "));
cout << endl << endl;
cout << "When the iterator is initialized to point to "
<< *itr << endl;
//
// Use of distance
//
vector<int>::difference_type dist = 0;
distance(v.begin(), itr, dist);
cout << "The distance between the beginning and itr is "
<< dist << endl;
return 0;
}
Output :
For the vector: 3 4 5 6 7 8
When the iterator is initialized to point to 6
The distance between the beginning and itr is 3
WARNING
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector <int, allocator,int> > instead of:
vector <int>
Also, if your compiler does not support partial specialization then
you will not be able to use the version of distance that returns
the distance. Instead you'll have to use the version that
increments a reference parameter.
SEE ALSO
sequence, random_iterator
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
distance_type
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
distance_type - Determine the type of distance used by an iterator.
This function is now obsolete. It is retained in order to
provide backward compatibility and support compilers that
do not provide partial specialization.
SYNOPSIS
#include <iterator>
template <class T, class Distance>
inline Distance* distance_type (const input_iterator<T,
Distance>&)
template <class T, class Distance>
inline Distance* distance_type (const forward_iterator<T,
Distance>&)
template <class T, class Distance>
inline Distance*
distance_type (const bidirectional_iterator<T, Distance>&)
template <class T, class Distance>
inline Distance*
distance_type (const random_access_iterator<T, Distance>&)
template <class T>
inline ptrdiff_t* distance_type (const T*)
DESCRIPTION
The distance_type family of function templates return a pointer to a
value that is of the same type as that used to represent a
distance between two iterators. The first four of these
take an iterator of a particular type and return a pointer to a
default value of the distance_type for that iterator. The T* form
of the function returns ptrdiff_t*.
Generic algorithms use this function to create local variables of
the correct type. The distance_type functions are typically
used like this:
template <class Iterator>
void foo(Iterator first, Iterator last)
{
__foo(begin,end,distance_type(first));
}
template <class Iterator, class Distance>
void __foo(Iterator first,Iterator last, Distance*>
{ Distance d = Distance();
distance(first,last,d);
}
The auxiliary function template allows the algorithm to extract a
distance type from the first iterator and then use that type
to perform some useful work.
SEE ALSO
Other iterator primitives: value_type, iterator_category, distance,
advance
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
equal
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
equal - Compares two ranges for equality.
SYNOPSIS
#include <algorithm>
template <class InputIterator1, class InputIterator2>
bool equal(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2);
template <class InputIterator1, class InputIterator2,
class BinaryPredicate>
bool equal(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, BinaryPredicate binary_pred);
DESCRIPTION
The equal algorithm does a pairwise comparison of all of the
elements in one range with all of the elements in
another range to see if they match. The first version of equal
uses the equal operator (==) as the comparison function, and the
second version allows you to specify a binary predicate as the
comparison function. The first version returns true if all of
the corresponding elements are equal to each other. The second
version of equal returns true if for each pair of elements in
the two ranges, the result of applying the binary predicate is
true. In other words, equal returns true if both of the following
are true:
1. There are at least as many elements in the second range as in the
first;
2. For every iterator i in the range [first1, last1) the following
corresponding conditions hold:
*i == *(first2 + (i - first1))
or
binary_pred(*i, *(first2 + (i - first1))) == true
Otherwise, equal returns false.
This algorithm assumes that there are at least as many elements
available after first2 as there are in the range [first1,
last1).
COMPLEXITY
equal performs at most last1-first1 comparisons or applications of
the predicate.
EXAMPLE
//
// equal.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main()
{
int d1[4] = {1,2,3,4};
int d2[4] = {1,2,4,3};
//
// Set up two vectors
//
vector<int> v1(d1+0, d1 + 4), v2(d2+0, d2 + 4);
// Check for equality
bool b1 = equal(v1.begin(),v1.end(),v2.begin());
bool b2 = equal(v1.begin(),v1.end(),
v2.begin(),equal_to<int>());
// Both b1 and b2 are false
cout << (b1 ? "TRUE" : "FALSE") << " "
<< (b2 ? "TRUE" : "FALSE") << endl;
return 0;
}
Output :
FALSE FALSE
WARNINGS
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int,allocator<int> >
instead of:
vector<int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
equal_range
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
equal_range - Find the largest subrange in a collection into which
a given value can be inserted without violating the ordering
of the collection.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator, class T>
pair<ForwardIterator, ForwardIterator>
equal_range(ForwardIterator first, ForwardIterator last,
const T& value);
template <class ForwardIterator, class T, class Compare>
pair<ForwardIterator, ForwardIterator>
equal_range(ForwardIterator first, ForwardIterator last,
const T& value, Compare comp);
DESCRIPTION
The equal_range algorithm performs a binary search on an ordered
container to determine where the element value can be inserted
without violating the container's ordering. The library provides
two versions of the algorithm. The first version uses the less than
operator (operator <) to search for the valid insertion range,
and assumes that the sequence was sorted using the less than
operator. The second version allows you to specify a function
object of type Compare, and assumes that Compare was the
function used to sort the sequence. The function object must be a
binary predicate.
equal_range returns a pair of iterators, i and j that define a range
containing elements equivalent to value, i.e., the first and
last valid insertion points for value. If value is not an element
in the container, i and j are equal. Otherwise, i will
point to the first element not "less" than value, and j will
point to the first element greater than value. In the second
version, "less" is defined by the comparison object. Formally,
equal_range returns a subrange [i, j) such that value can be
inserted at any iterator k within the range. Depending upon the
version of the algorithm used, k must satisfy one of the
following conditions:
!(*k < value) && !(value < *k)
or
comp(*k,value) == false && comp(value, *k) == false
The range [first,last) is assumed to be sorted.
COMPLEXITY
equal_range performs at most 2 * log(last - first) + 1 comparisons.
EXAMPLE
//
// eqlrange.cpp
//
#include <vector>
#include <algorithm>
#include <iostream.h>
int main()
{
typedef vector<int>::iterator iterator;
int d1[11] = {0,1,2,2,3,4,2,2,2,6,7};
//
// Set up a vector
//
vector<int> v1(d1+0, d1 + 11);
//
// Try equal_range variants
//
pair<iterator,iterator> p1 =
equal_range(v1.begin(),v1.end(),3);
// p1 = (v1.begin() + 4,v1.begin() + 5)
pair<iterator,iterator> p2 =
equal_range(v1.begin(),v1.end(),2,less<int>());
// p2 = (v1.begin() + 4,v1.begin() + 5)
// Output results
cout << endl << "The equal range for 3 is: "
<< "( " << *p1.first << " , "
<< *p1.second << " ) " << endl << endl;
cout << endl << "The equal range for 2 is: "
<< "( " << *p2.first << " , "
<< *p2.second << " ) " << endl;
return 0;
}
Output :
The equal range for 3 is: ( 3 , 4 )
The equal range for 2 is: ( 2 , 3 )
WARNINGS
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int,allocator<int> >
SEE ALSO
instead of:
vector<int> binary_function, lower_bound, upper_bound
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
equal_to
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
equal_to - Binary function object that returns true if its first
argument equals its second
SYNOPSIS
#include <functional>
template <class T>
struct equal_to;
DESCRIPTION
equal_to is a binary function object. Its operator() returns true
if x is equal to y. You can pass an equal_to object to any
algorithm that requires a binary function. For example, the
transform algorithm applies a binary operation to corresponding
values in two collections and stores the result. equal_to would be
used in that algorithm in the following manner:
vector<int> vec1;
vector<int> vec2;
vector<int> vecResult;
transform(vec1.begin(), vec1.end(),
vec2.begin(), vecResult.begin(),
equal_to<int>());
After this call to transform, vecResult(n) will contain a "1" if
vec1(n) was equal to vec2(n) or a "0" if vec1(n) was not equal to
vec2(n).
INTERFACE
template <class T>
struct equal_to : binary_function<T, T, bool>
{
typedef typename binary_function<T, T, bool>::second_argument_type
second_argument_type;
typedef typename binary_function<T, T, bool>::first_argument_type
first_argument_type;
typedef typename binary_function<T, T, bool>::result_type
result_type;
SEE ALSO
bool operator() (const T&, const T&) const;
}; binary_function, function objects
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
fill
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
fill, fill_n - Initializes a range with a given value.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator, class T>
void fill(ForwardIterator first, ForwardIterator last,
const T& value);
template <class OutputIterator, class Size, class T>
void fill_n(OutputIterator first, Size n, const T& value);
DESCRIPTION
The fill and fill_n algorithms are used to assign a value to the
elements in a sequence. fill assigns the value to all the
elements designated by iterators in the range [first, last).
The fill_n algorithm assigns the value to all the elements
designated by iterators in the range [first, first + n). fill_n
assumes that there are at least n elements following first,
unless first is an insert iterator.
COMPLEXITY
fill makes exactly last - first assignments, and fill_n makes
exactly n assignments.
EXAMPLE
//
// fill.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main()
{
int d1[4] = {1,2,3,4};
//
// Set up two vectors
//
vector<int> v1(d1,d1 + 4), v2(d1,d1 + 4);
//
// Set up one empty vector
//
vector<int> v3;
//
// Fill all of v1 with 9
//
fill(v1.begin(),v1.end(),9);
//
// Fill first 3 of v2 with 7
//
fill_n(v2.begin(),3,7);
//
// Use insert iterator to fill v3 with 5 11's
//
fill_n(back_inserter(v3),5,11);
//
// Copy all three to cout
//
ostream_iterator<int,char> out(cout," ");
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
copy(v3.begin(),v3.end(),out);
cout << endl;
//
// Fill cout with 3 5's
//
fill_n(ostream_iterator<int,char>(cout," "),3,5);
cout << endl;
return 0;
}
Output :
9 9 9 9
7 7 7 4
11 11 11 11 11
5 5 5
WARNINGS
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int,allocator<int> >
instead of:
vector<int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
fill_n
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
fill, fill_n - Initializes a range with a given value.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator, class T>
void fill(ForwardIterator first, ForwardIterator last,
const T& value);
template <class OutputIterator, class Size, class T>
void fill_n(OutputIterator first, Size n, const T& value);
DESCRIPTION
The fill and fill_n algorithms are used to assign a value to the
elements in a sequence. fill assigns the value to all the
elements designated by iterators in the range [first, last).
The fill_n algorithm assigns the value to all the elements
designated by iterators in the range [first, first + n). fill_n
assumes that there are at least n elements following first,
unless first is an insert iterator.
COMPLEXITY
fill makes exactly last - first assignments, and fill_n makes
exactly n assignments.
EXAMPLE
//
// fill.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main()
{
int d1[4] = {1,2,3,4};
//
// Set up two vectors
//
vector<int> v1(d1,d1 + 4), v2(d1,d1 + 4);
//
// Set up one empty vector
//
vector<int> v3;
//
// Fill all of v1 with 9
//
fill(v1.begin(),v1.end(),9);
//
// Fill first 3 of v2 with 7
//
fill_n(v2.begin(),3,7);
//
// Use insert iterator to fill v3 with 5 11's
//
fill_n(back_inserter(v3),5,11);
//
// Copy all three to cout
//
ostream_iterator<int,char> out(cout," ");
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
copy(v3.begin(),v3.end(),out);
cout << endl;
//
// Fill cout with 3 5's
//
fill_n(ostream_iterator<int,char>(cout," "),3,5);
cout << endl;
return 0;
}
Output :
9 9 9 9
7 7 7 4
11 11 11 11 11
5 5 5
WARNINGS
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int,allocator<int> >
instead of:
vector<int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
find
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
find - Find an occurrence of value in a sequence
SYNOPSIS
#include <algorithm>
template <class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last,
const T& value);
DESCRIPTION
The find algorithm lets you search for the first occurrence of a
particular value in a sequence. find returns the first
iterator i in the range [first, last) for which the
following condition holds:
*i == value.
If find does not find a match for value, it returns the iterator
last.
COMPLEXITY
find performs at most last-first comparisons.
EXAMPLE
//
// find.cpp
//
#include <vector>
#include <algorithm>
int main()
{
typedef vector<int>::iterator iterator;
int d1[10] = {0,1,2,2,3,4,2,2,6,7};
// Set up a vector
vector<int> v1(d1,d1 + 10);
// Try find
iterator it1 = find(v1.begin(),v1.end(),3);
// it1 = v1.begin() + 4;
// Try find_if
iterator it2 =
find_if(v1.begin(),v1.end(),bind1st(equal_to<int>(),3));
// it2 = v1.begin() + 4
// Try both adjacent_find variants
iterator it3 = adjacent_find(v1.begin(),v1.end());
// it3 = v1.begin() +2
iterator it4 =
adjacent_find(v1.begin(),v1.end(),equal_to<int>());
// v4 = v1.begin() + 2
// Output results
cout << *it1 << " " << *it2 << " " << *it3 << " "
<< *it4 << endl;
return 0;
}
Output : 3 3 2 2
WARNING
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int,allocator<int> >
instead of:
vector<int>
SEE ALSO
adjacent_find, find_first_of, find_if
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
find_end
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
find_end - Finds the last occurrence of a sub-sequence in a sequence.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_end(ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template <class Forward Iterator1, class ForwardIterator2,
class BinaryPredicate>
ForwardIterator1 find_end(ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred);
DESCRIPTION
The find_end algorithm finds the last occurrence of a sub-sequence,
indicated by [first2, last2), in a sequence, [first1,last1).
The algorithm returns an iterator pointing to the first element
of the found subsequence, or last1 if no match is found.
More precisely, the find_end algorithm returns the last iterator
i in the range [first1, last1 - (last2-first2)) such that
for any non-negative integer n < (last2-first2), the
following corresponding conditions hold:
*(i+n) == *(first2+n),
pred(*(i+n),*(first2+n)) == true.
Or returns last1 if no such iterator is found.
Two versions of the algorithm exist. The first uses the equality
operator as the default binary predicate, and the second allows
you to specify a binary predicate.
COMPLEXITY
At most (last2-first2)*(last1-first1-(last2-first2)+1) applications
of the corresponding predicate are done.
EXAMPLE
//
// find_end.cpp
//
#include<vector>
#include<iterator>
#include<algorithm>
#include<iostream.h>
int main()
{
typedef vector<int>::iterator iterator;
int d1[10] = {0,1,6,5,3,2,2,6,5,7};
int d2[4] = {6,5,0,0}
//
// Set up two vectors.
//
vector<int> v1(d1+0, d1+10), v2(d2+0, d2+2);
//
// Try both find_first_of variants.
//
iterator it1 = find_first_of (v1.begin(), v1.end(), v2.begin(),
v2.end());
iterator it2 = find_first_of (v1.begin(), v1.end(), v2.begin(),
v2.end(), equal_to<int>());
//
// Try both find_end variants.
//
iterator it3 = find_end (v1.begin(), v1.end(), v2.begin(),
v2.end());
iterator it4 = find_end (v1.begin(), v1.end(), v2.begin(),
v2.end(), equal_to<int>());
//
// Output results of find_first_of.
// Iterator now points to the first element that matches one of
// a set of values
//
cout << "For the vectors: ";
copy (v1.begin(), v1.end(), ostream_iterator<int>(cout," "));
cout << " and ";
copy (v2.begin(), v2.end(), ostream_iterator<int>(cout," "));
cout<< endl ,, endl
<< "both versions of find_first_of point to: "
<< *it1 << endl << "with first_of address = " << it1
<< endl ;
//
//Output results of find_end.
// Iterator now points to the first element of the last find
//sub-sequence.
//
cout << endl << endl
<< "both versions of find_end point to: "
<< *it3 << endl << "with find_end address = " << it3
<< endl ;
return 0;
}
Output :
For the vectors: 0 1 6 5 3 2 2 6 5 7 and 6 5
both versions of find_first_of point to: 6
with first_of address = 0x100005c0
both versions of find_end point to: 6
with find_end address = 0x100005d4
WARNINGS
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int, allocator<int> >
instead of:
vector<int>
SEE ALSO
Algorithms, find, find_if, adjacent_find
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
find_first_of
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
find_first_of - Finds the first occurrence of any value from one
sequence in another sequence.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_first_of (ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template <class ForwardIterator1, class ForwardIterator2,
class BinaryPredicate>
ForwardIterator1 find_first_of (ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred);
DESCRIPTION
The find_first_of algorithm finds a the first occurrence of a value
from a sequence, specified by first2, last2, in a sequence
specified by first1, last1. The algorithm returns an iterator in
the range [first1, last1) that points to the first matching
element. If the first sequence [first1, last1) does
not contain any of the values in the second sequence, find_first_of
returns last1.
In other words, find_first_of returns the first iterator i in the
[first1, last1)such that for some integer j in the range
[first2, last2):the following conditions hold:
*i == *j, pred(*i,*j) == true.
Or find_first_of returns last1 if no such iterator is found.
COMPLEXITY
Two versions of the algorithm exist. The first uses the equality
operator as the default binary predicate, and the second allows
you to specify a binary predicate.
At most (last1 - first1)*(last2 - first2) applications of the
corresponding predicate are done.
EXAMPLE
//
// find_f_o.cpp
//
#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream.h>
int main()
{
typedef vector<int>::iterator iterator;
int d1[10] = {0,1,2,2,3,4,2,2,6,7};
int d2[2] = {6,4};
//
// Set up two vectors
//
vector<int> v1(d1,d1 + 10), v2(d2,d2 + 2);
//
// Try both find_first_of variants
//
iterator it1 =
find_first_of(v1.begin(),v1.end(),v2.begin(),v2.end());
find_first_of(v1.begin(),v1.end(),v2.begin(),v2.end(),
equal_to<int>());
//
// Output results
//
cout << "For the vectors: ";
copy(v1.begin(),v1.end(),
ostream_iterator<int,char>(cout," " ));
cout << " and ";
copy(v2.begin(),v2.end(),
ostream_iterator<int,char>(cout," " ));
cout << endl << endl
<< "both versions of find_first_of point to: "
<< *it1;
return 0;
}
Output :
For the vectors: 0 1 2 2 3 4 2 2 6 7 and 6 4
both versions of find_first_of point to: 4
WARNINGS
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int, allocator<int> >
instead of:
vector<int>
SEE ALSO
Algorithms, adjacent_find, find, find_if, find_next, find_end
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
find_if
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
find_if - Find an occurrence of value in a sequence that satisfies
a specifed predicate.
SYNOPSIS
#include <algorithm>
template <class InputIterator, class Predicate>
InputIterator find_if(InputIterator first,
InputIterator last,
Predicate pred);
DESCRIPTION
The find_if algorithm allows you to search for the first element in
a sequence that satisfies a particular condition. The
sequence is defined by iterators first and last, while the
condition is defined by the third argument: a
predicate function that returns a boolean value. find_if returns
the first iterator i in the range [first, last) for which the
following condition holds:
pred(*i) == true.
If no such iterator is found, find_if returns last.
COMPLEXITY
find_if performs at most last-first applications of the corresponding
predicate.
EXAMPLE
//
// find.cpp
//
#include <vector>
#include <algorithm>
#include <iostream.h>
int main()
{
typedef vector<int>::iterator iterator;
int d1[10] = {0,1,2,2,3,4,2,2,6,7};
// Set up a vector
vector<int> v1(d1,d1 + 10);
// Try find
iterator it1 = find(v1.begin(),v1.end(),3);
// it1 = v1.begin() + 4;
// Try find_if
iterator it2 =
find_if(v1.begin(),v1.end(),bind1st(equal_to<int>(),3));
// it2 = v1.begin() + 4
// Try both adjacent_find variants
iterator it3 = adjacent_find(v1.begin(),v1.end());
// it3 = v1.begin() +2
iterator it4 =
adjacent_find(v1.begin(),v1.end(),equal_to<int>());
// v4 = v1.begin() + 2
// Output results
cout << *it1 << " " << *it2 << " " << *it3 << " "
<< *it4 << endl;
return 0;
}
Output : 3 3 2 2
WARNING
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int, allocator<int> >
instead of:
vector<int>
SEE ALSO
adjacent_find, Algorithms, find, find_end, find_first_of
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
for_each
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
for_each - Applies a function to each element in a range.
SYNOPSIS
#include <algorithm>
template <class InputIterator, class Function>
void for_each(InputIterator first, InputIterator last,
Function f);
DESCRIPTION
The for_each algorithm applies function f to all members of the
sequence in the range [first, last), where first and last are
iterators that define the sequence. Since this a non-mutating
algorithm, the function f cannot make any modifications to the
sequence, but it can achieve results through side effects (such
as copying or printing). If f returns a result, the result is
ignored.
COMPLEXITY
The function f is applied exactly last - first times.
EXAMPLE
//
// for_each.cpp
//
#include <vector>
#include <algorithm>
#include <iostream.h>
// Function class that outputs its argument times x
template <class Arg>
class out_times_x : private unary_function<Arg,void>
{
private:
Arg multiplier;
public:
out_times_x(const Arg& x) : multiplier(x) { }
void operator()(const Arg& x)
{ cout << x * multiplier << " " << endl; }
};
int main()
{
int sequence[5] = {1,2,3,4,5};
// Set up a vector
vector<int> v(sequence,sequence + 5);
// Setup a function object
out_times_x<int> f2(2);
for_each(v.begin(),v.end(),f2); // Apply function
return 0;
}
Output : 2 4 6 8 10
WARNING
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int, allocator<int> >
instead of:
vector<int>
SEE ALSO
Algorithms, function object
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
generate
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
generate, generate_n - Initialize a container with values produced by a
value-generator class.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator, class Generator>
void generate(ForwardIterator first, ForwardIterator last,
Generator gen);
template <class OutputIterator, class Size, class Generator>
void generate_n(OutputIterator first, Size n, Generator gen);
DESCRIPTION
A value-generator function returns a value each time it is invoked.
The algorithms generate and generate_n initialize (or
reinitialize) a sequence by assigning the return value of the
generator function gen to all the elements designated by
iterators in the range [first, last) or [first, first + n). The
function gen takes no arguments. (gen can be a function or a class
with an operator () defined that takes no arguments.)
generate_n assumes that there are at least n elements following
first, unless first is an insert iterator.
COMPLEXITY
The generate and generate_n algorithms invoke gen and assign its
return value exactly last - first (or n) times.
EXAMPLE
//
// generate.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
// Value generator simply doubles the current value
// and returns it
template <class T>
class generate_val
{
private:
T val_;
public:
generate_val(const T& val) : val_(val) {}
T& operator()() { val_ += val_; return val_; }
};
int main()
{
int d1[4] = {1,2,3,4};
generate_val<int> gen(1);
// Set up two vectors
vector<int> v1(d1,d1 + 4), v2(d1,d1 + 4);
// Set up one empty vector
vector<int> v3;
// Generate values for all of v1
generate(v1.begin(),v1.end(),gen);
// Generate values for first 3 of v2
generate_n(v2.begin(),3,gen);
// Use insert iterator to generate 5 values for v3
generate_n(back_inserter(v3),5,gen);
// Copy all three to cout
ostream_iterator<int,char> out(cout," ");
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
copy(v3.begin(),v3.end(),out);
cout << endl;
// Generate 3 values for cout
generate_n(ostream_iterator<int>(cout," "),3,gen);
cout << endl;
return 0;
}
Output :
2 4 8 16
2 4 8 4
2 4 8 16 32
2 4 8
WARNINGS
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you'll have to write:
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
function objects
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
generate_n
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
generate, generate_n - Initialize a container with values produced
by a value-generator class.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator, class Generator>
void generate(ForwardIterator first, ForwardIterator last,
Generator gen);
template <class OutputIterator, class Size, class Generator>
void generate_n(OutputIterator first, Size n, Generator gen);
DESCRIPTION
A value-generator function returns a value each time it is invoked.
The algorithms generate and generate_n initialize (or
reinitialize) a sequence by assigning the return value of the
generator function gen to all the elements designated by
iterators in the range [first, last) or [first, first + n). The
function gen takes no arguments. (gen can be a function or a class
with an operator () defined that takes no arguments.)
generate_n assumes that there are at least n elements following
first, unless first is an insert iterator.
COMPLEXITY
The generate and generate_n algorithms invoke gen and assign its
return value exactly last - first (or n) times.
EXAMPLE
//
// generate.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
// Value generator simply doubles the current value
// and returns it
template <class T>
class generate_val
{
private:
T val_;
public:
generate_val(const T& val) : val_(val) {}
T& operator()() { val_ += val_; return val_; }
};
int main()
{
int d1[4] = {1,2,3,4};
generate_val<int> gen(1);
// Set up two vectors
vector<int> v1(d1,d1 + 4), v2(d1,d1 + 4);
// Set up one empty vector
vector<int> v3;
// Generate values for all of v1
generate(v1.begin(),v1.end(),gen);
// Generate values for first 3 of v2
generate_n(v2.begin(),3,gen);
// Use insert iterator to generate 5 values for v3
generate_n(back_inserter(v3),5,gen);
// Copy all three to cout
ostream_iterator<int,char> out(cout," ");
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
copy(v3.begin(),v3.end(),out);
cout << endl;
// Generate 3 values for cout
generate_n(ostream_iterator<int>(cout," "),3,gen);
cout << endl;
return 0;
}
Output :
2 4 8 16
2 4 8 4
2 4 8 16 32
2 4 8
WARNINGS
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you'll have to write:
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
function objects
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
greater
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
greater - Binary function object that returns true if its first
argument is greater than its second.
SYNOPSIS
#include <functional>
template <class T>
struct greater : binary_function<T, T, bool> {
typedef typename binary_function<T, T, bool>::second_argument_type
second_argument_type;
typedef typename binary_function<T, T, bool>::first_argument_type
first_argument_type;
typedef typename binary_function<T, T, bool>::result_type
result_type;
bool operator() (const T&, const T&) const;
};
DESCRIPTION
greater is a binary function object. Its operator() returns true if
x is greater than y. You can pass a greater object to any
algorithm that requires a binary function. For example, the
transform algorithm applies a binary operation to corresponding
values in two collections and stores the result of the
function. greater would be used in that algorithm in the following
manner:
vector<int> vec1;
vector<int> vec2;
vector<int> vecResult;
transform(vec1.begin(), vec1.end(),
vec2.begin(), vecResult.begin(), greater<int>());
WARNINGS
After this call to transform, vecResult(n) will contain a "1" if
vec1(n) was greater than vec2(n) or a "0" if vec1(n) was less than
or equal to vec2(n).
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you'll have to write :
vector<int, allocator<int> >
instead of
vector<int>
SEE ALSO
function objects
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
greater_equal
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
greater_equal - Binary function object that returns true if its
first argument is greater than or equal to its second
SYNOPSIS
#include <functional>
template <class T>
struct greater_equal ; : binary_function<T, T, bool> {
typedef typename binary_function<T, T, bool>::second_argument_type
second_argument_type;
typedef typename binary_function<T, T, bool>::first_argument_type
first_argument_type;
typedef typename binary_function<T, T, bool>::result_type
result_type;
bool operator() (const T&, const T&) const;
};
DESCRIPTION
greater_equal is a binary function object. Its operator() returns
true if x is greater than or equal to y. You can pass a
greater_equal object to any algorithm that requires a binary
function. For example, the sort algorithm can accept a
binary function as an alternate comparison object to sort a
sequence. greater_equal would be used in that algorithm in
the following manner:
vector<int> vec1;
sort(vec1.begin(), vec1.end(),greater_equal<int>());
After this call to sort, vec1 will be sorted in descending order.
WARNINGS
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you'll have to write :
vector<int, allocator<int> >
instead of
vector<int>
SEE ALSO
function objects
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
Heap_Operations
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
Heap_Operations
See the entries for make_heap, pop_heap, push_heap and sort_heap
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
includes
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
includes - Basic set operation for sorted sequences.
SYNOPSIS
#include <algorithm>
template <class InputIterator1, class InputIterator2>
bool includes (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2);
template <class InputIterator1, class InputIterator2, class Compare>
bool includes (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
Compare comp);
DESCRIPTION
The includes algorithm compares two sorted sequences and returns
true if every element in the range [first2, last2) is
contained in the range [first1, last1). It returns false otherwise.
include assumes that the sequences are sorted using the
default comparison operator less than (<), unless an alternative
comparison operator (comp) is provided.
COMPLEXITY
At most ((last1 - first1) + (last2 - first2)) * 2 -1 comparisons
are performed.
EXAMPLE
//
// includes.cpp
//
#include <algorithm>
#include <set>
#include <iostream.h>
int main()
{
//Initialize some sets
int a1[10] = {1,2,3,4,5,6,7,8,9,10};
int a2[6] = {2,4,6,8,10,12};
int a3[4] = {3,5,7,8};
set<int, less<int> > all(a1, a1+10), even(a2, a2+6),
small(a3,a3+4);
//Demonstrate includes
cout << "The set: ";
copy(all.begin(),all.end(),
ostream_iterator<int,char>(cout," "));
bool answer = includes(all.begin(), all.end(),
small.begin(), small.end());
cout << endl
<< (answer ? "INCLUDES " : "DOES NOT INCLUDE ");
copy(small.begin(),small.end(),
ostream_iterator<int,char>(cout," "));
answer = includes(all.begin(), all.end(),
even.begin(), even.end());
cout << ", and" << endl
<< (answer ? "INCLUDES" : "DOES NOT INCLUDE ");
copy(even.begin(),even.end(),
ostream_iterator<int,char>(cout," "));
cout << endl << endl;
return 0;
}
Output :
The set: 1 2 3 4 5 6 7 8 9 10
INCLUDES 3 5 7 8 , and
DOES NOT INCLUDE 2 4 6 8 10 12
WARNINGS
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you'll have to write :
set<int, less<int>, allocator<int> >
instead of
set<int>
SEE ALSO
set, set_union, set_intersection, set_difference,
set_symmetric_difference
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
inner_product
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
inner_product - Computes the inner product A X B of two ranges A
and B.
SYNOPSIS
#include <numeric>
template <class InputIterator1, class InputIterator2,
class T>
T inner_product (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, T init);
template <class InputIterator1, class InputIterator2,
class T,
class BinaryOperation1,
class BinaryOperation2>
T inner_product (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, T init,
BinaryOperation1 binary_op1,
BinaryOperation2 binary_op2);
DESCRIPTION
There are two versions of inner_product. The first computes an
inner product using the default multiplication and addition
operators, while the second allows you to specify binary
operations to use in place of the default operations.
The first version of the function computes its result by
initializing the accumulator acc with the initial value init and
then modifying it with:
acc = acc + ((*i1) * (*i2))
for every iterator i1 in the range [first1, last1) and iterator i2
in the range [first2, first2 + (last1 - first1)). The
algorithm returns acc.
The second version of the function initializes acc with init, then
computes the result:
acc = binary_op1(acc, binary_op2(*i1, *i2))
for every iterator i1 in the range [first1, last1) and iterator i2
in the range [first2, first2 + (last1 - first1)).
COMPLEXITY
The inner_product algorithm computes exactly (last1 - first1)
applications of either:
acc + (*i1) * (*i2)
or
binary_op1(acc, binary_op2(*i1, *i2)).
EXAMPLE
//
// inr_prod.cpp
//
#include <numeric> //For inner_product
#include <list> //For list
#include <vector> //For vectors
#include <functional> //For plus and minus
#include <iostream.h>
int main()
{
//Initialize a list and an int using arrays of ints
int a1[3] = {6, -3, -2};
int a2[3] = {-2, -3, -2};
list<int> l(a1, a1+3);
vector<int> v(a2, a2+3);
//Calculate the inner product of the two sets of values
int inner_prod =
inner_product(l.begin(), l.end(), v.begin(), 0);
//Calculate a wacky inner product using the same values
int wacky =
inner_product(l.begin(), l.end(), v.begin(), 0,
plus<int>(), minus<int>());
//Print the output
cout << "For the two sets of numbers: " << endl
<< " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << " and ";
copy(l.begin(),l.end(),ostream_iterator<int,char>(cout," "));
cout << "," << endl << endl;
cout << "The inner product is: " << inner_prod << endl;
cout << "The wacky result is: " << wacky << endl;
return 0;
}
Output :
For the two sets of numbers:
-2 -3 -2
and 6 -3 -2 ,
The inner product is: 1
The wacky result is: 8
WARNINGS
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you'll have to write :
list<int, allocator<int> > and vector<int, allocator<int> >
instead of
list<int> and vector<int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
inplace_merge
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
inplace_merge - Merge two sorted sequences into one.
SYNOPSIS
#include <algorithm>
template <class BidirectionalIterator>
void inplace_merge(BidirectionalIterator first,
BidirectionalIterator middle,
BidirectionalIterator last);
template <class BidirectionalIterator, class Compare>
void inplace_merge(BidirectionalIterator first,
BidirectionalIterator middle,
BidirectionalIterator last, Compare comp);
DESCRIPTION
The inplace_merge algorithm merges two sorted consecutive ranges
[first, middle) and [middle, last), and puts the result of the merge
into the range [first, last). The merge is stable, that is,
if the two ranges contain equivalent elements, the elements from the
first range always precede the elements from the second.
There are two versions of the inplace_merge algorithm. The first
version uses the less than operator (operator<) as the default for
comparison, and the second version accepts a third argument that
specifies a comparison operator.
COMPLEXITY
When enough additional memory is available, inplace_merge does at
most (last - first) - 1 comparisons. If no additional memory is
available, an algorithm with O(NlogN) complexity (where N is equal
to last-first) may be used.
EXAMPLE
//
// merge.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main()
{
int d1[4] = {1,2,3,4};
int d2[8] = {11,13,15,17,12,14,16,18};
// Set up two vectors
vector<int> v1(d1,d1 + 4), v2(d1,d1 + 4);
// Set up four destination vectors
vector<int> v3(d2,d2 + 8),v4(d2,d2 + 8),
v5(d2,d2 + 8),v6(d2,d2 + 8);
// Set up one empty vector
vector<int> v7;
// Merge v1 with v2
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v3.begin());
// Now use comparator
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v4.begin(),
less<int>());
// In place merge v5
vector<int>::iterator mid = v5.begin();
advance(mid,4);
inplace_merge(v5.begin(),mid,v5.end());
// Now use a comparator on v6
mid = v6.begin();
advance(mid,4);
inplace_merge(v6.begin(),mid,v6.end(),less<int>());
// Merge v1 and v2 to empty vector using insert iterator
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),
back_inserter(v7));
// Copy all cout
ostream_iterator<int,char> out(cout," ");
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
copy(v3.begin(),v3.end(),out);
cout << endl;
copy(v4.begin(),v4.end(),out);
cout << endl;
copy(v5.begin(),v5.end(),out);
cout << endl;
copy(v6.begin(),v6.end(),out);
cout << endl;
copy(v7.begin(),v7.end(),out);
cout << endl;
// Merge v1 and v2 to cout
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),
ostream_iterator<int,char>(cout," "));
cout << endl;
return 0;
}
Output:
1 2 3 4
1 2 3 4
1 1 2 2 3 3 4 4
1 1 2 2 3 3 4 4
11 12 13 14 15 16 17 18
11 12 13 14 15 16 17 18
1 1 2 2 3 3 4 4
1 1 2 2 3 3 4 4
WARNINGS
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you'll have to write :
vector<int, allocator,int> >
instead of
vector<int>
SEE ALSO
merge
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
iter_swap
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
iter_swap - Exchange values pointed at in two locations
SYNOPSIS
#include <algorithm>
template <class ForwardIterator1, class ForwardIterator2>
void iter_swap (ForwardIterator1, ForwardIterator2);
DESCRIPTION
The iter_swap algorithm exchanges the values pointed at by the two
iterators a and b.
EXAMPLE
#include <vector>
#include <algorithm>
#include <iostream.h>
int main ()
{
int d1[] = {6, 7, 8, 9, 10, 1, 2, 3, 4, 5};
//
// Set up a vector.
//
vector<int> v(d1+0, d1+10);
//
// Output original vector.
//
cout << "For the vector: ";
copy(v.begin(), v.end(), ostream_iterator<int,char>(cout," "));
//
// Swap the first five elements with the last five elements.
//
swap_ranges(v.begin(), v.begin()+5, v.begin()+5);
//
// Output result.
//
cout << endl << endl
<< "Swapping the first 5 elements with the last 5 gives: "
<< endl << " ";
copy(v.begin(), v.end(), ostream_iterator<int,char>(cout," "));
//
// Now an example of iter_swap -- swap first and last elements.
//
iter_swap(v.begin(), v.end()-1);
//
// Output result.
//
cout << endl << endl
<< "Swapping the first and last elements gives: "
<< endl << " ";
copy(v.begin(), v.end(), ostream_iterator<int,char>(cout," "));
cout << endl;
return 0;
}
Output :
For the vector: 6 7 8 9 10 1 2 3 4 5
Swapping the first five elements with the last five gives:
1 2 3 4 5 6 7 8 9 10
Swapping the first and last elements gives:
10 2 3 4 5 6 7 8 9 1
WARNING
If your compiler does not support default template parameters, then
you will need to always supply the Allocator template argument. For
instance, you'll have to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
Iterators, swap, swap_ranges
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
lexicographical_compare
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
lexicographical_compare - Compares two ranges lexicographically.
SYNOPSIS
#include <algorithm>
template <class InputIterator1, class InputIterator2>
bool
lexicographical_compare(InputIterator1 first,
InputIterator2 last1,
InputIterator2 first2,
InputIterator last2);
template <class InputIterator1, class InputIterator2, class Compare>
bool
lexicographical_compare(InputIterator1 first,
InputIterator2 last1,
InputIterator2 first2,
InputIterator last2, Compare comp);
DESCRIPTION
The lexicographical_compare functions compare each element in the
range [first1, last1) to the corresponding element in the range
[first2, last2) using iterators i and j.
The first version of the algorithm uses operator< as the default
comparison operator. It immediately returns true if it
encounters any pair in which *i is less than *j, and immediately
returns false if *j is less than *i. If the algorithm reaches the
end of the first sequence before reaching the end of the second
sequence, it also returns true.
The second version of the function takes an argument comp that
defines a comparison function that is used in place of the default
operator<.
The lexicographical_compare functions can be used with all the
datatypes provided by the standard library.
COMPLEXITY
lexicographical_compare performs at most min((last1 - first1),
(last2 - first2)) applications of the comparison
function.
EXAMPLE
//
// lex_comp.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main(void)
{
int d1[5] = {1,3,5,32,64};
int d2[5] = {1,3,2,43,56};
// set up vector
vector<int> v1(d1,d1 + 5), v2(d2,d2 + 5);
// Is v1 less than v2 (I think not)
bool b1 = lexicographical_compare(v1.begin(),
v1.end(), v2.begin(), v2.end());
// Is v2 less than v1 (yup, sure is)
bool b2 = lexicographical_compare(v2.begin(),
v2.end(), v1.begin(), v1.end(), less<int>());
cout << (b1 ? "TRUE" : "FALSE") << " "
<< (b2 ? "TRUE" : "FALSE") << endl;
return 0;
}
Output:
FALSE TRUE
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you'll have to write :
vector<int, allocator<int> >
instead of :
vector<int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
lower_bound
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
lower_bound - Determine the first valid position for an element in
a sorted container.
SYNOPSIS
template <class ForwardIterator, class T>
ForwardIterator lower_bound(ForwardIterator first,
ForwardIterator last,
const T& value);
template <class ForwardIterator, class T, class Compare>
ForwardIterator lower_bound(ForwardIterator first,
ForwardIterator last,
const T& value, Compare comp);
DESCRIPTION
The lower_bound algorithm compares a supplied value to elements in a
sorted container and returns the first position in the container
that value can occupy without violating the container's ordering.
There are two versions of the algorithm. The first uses the
less than operator (operator<) to perform the comparison, and
assumes that the sequence has been sorted using that operator.
The second version lets you include a function object of type
Compare, and assumes that Compare is the function used to sort
the sequence. The function object must be a binary predicate.
lower_bound's return value is the iterator for the first element in
the container that is greater than or equal to value, or, when
the comparison operator is used, the first element that does not
satisfy the comparison function. Formally, the algorithm returns
an iterator i in the range [first, last) such that for any
iterator j in the range [first, i) the following corresponding
conditions hold:
*j < value
or
comp(*j, value) == true
COMPLEXITY
lower_bound performs at most log(last - first) + 1 comparisons.
EXAMPLE
//
// ul_bound.cpp
//
#include <vector>
#include <algorithm>
#include <iostream.h>
int main()
{
typedef vector<int>::iterator iterator;
int d1[11] = {0,1,2,2,3,4,2,2,2,6,7};
// Set up a vector
vector<int> v1(d1,d1 + 11);
// Try lower_bound variants
iterator it1 = lower_bound(v1.begin(),v1.end(),3);
// it1 = v1.begin() + 4
iterator it2 =
lower_bound(v1.begin(),v1.end(),2,less<int>());
// it2 = v1.begin() + 4
// Try upper_bound variants
iterator it3 = upper_bound(v1.begin(),v1.end(),3);
// it3 = vector + 5
iterator it4 =
upper_bound(v1.begin(),v1.end(),2,less<int>());
// it4 = v1.begin() + 5
cout << endl << endl
<< "The upper and lower bounds of 3: ( "
<< *it1 << " , " << *it3 << " ]" << endl;
cout << endl << endl
<< "The upper and lower bounds of 2: ( "
<< *it2 << " , " << *it4 << " ]" << endl;
return 0;
}
Output :
The upper and lower bounds of 3: ( 3 , 4 ]
The upper and lower bounds of 2: ( 2 , 3 ]
WARNING
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int,allocator<int> >
instead of:
vector<int>
SEE ALSO
upper_bound, equal_range
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
make_heap
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
make_heap - Creates a heap.
SYNOPSIS
#include <algorithm>
template <class RandomAccessIterator>
void
make_heap(RandomAccessIterator first,
RandomAccessIterator last);
template <class RandomAccessIterator, class Compare>
void
make_heap(RandomAccessIterator first,
RandomAccessIterator last, Compare comp);
DESCRIPTION
A heap is a particular organization of elements in a range between
two random access iterators [a, b). Its two key properties are:
1. *a is the largest element in the range.
2. *a may be removed by the pop_heap algorithm, or a new element can be
added by the push_heap algorithm, in O(logN) time.
These properties make heaps useful as priority queues.
The heap algorithms use less than (operator<) as the default
comparison. In all of the algorithms, an alternate comparison
operator can be specified.
The first version of the make_heap algorithm arranges the elements
in the range [first, last) into a heap using less than
(operator<) to perform comparisons. The second version uses
the comparison operator comp to perform the comparisons. Since the
only requirements for a heap are the two listed above, make_heap
is not required to do anything within the range (first, last - 1).
COMPLEXITY
This algorithm makes at most 3 * (last - first) comparisons.
EXAMPLE
//
// heap_ops.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main(void)
{
int d1[4] = {1,2,3,4};
int d2[4] = {1,3,2,4};
// Set up two vectors
vector<int> v1(d1,d1 + 4), v2(d2,d2 + 4);
// Make heaps
make_heap(v1.begin(),v1.end());
make_heap(v2.begin(),v2.end(),less<int>());
// v1 = (4,x,y,z) and v2 = (4,x,y,z)
// Note that x, y and z represent the remaining
// values in the container (other than 4).
// The definition of the heap and heap operations
// does not require any particular ordering
// of these values.
// Copy both vectors to cout
ostream_iterator<int,char> out(cout," ");
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
// Now let's pop
pop_heap(v1.begin(),v1.end());
pop_heap(v2.begin(),v2.end(),less<int>());
// v1 = (3,x,y,4) and v2 = (3,x,y,4)
// Copy both vectors to cout
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
// And push
push_heap(v1.begin(),v1.end());
push_heap(v2.begin(),v2.end(),less<int>());
// v1 = (4,x,y,z) and v2 = (4,x,y,z)
// Copy both vectors to cout
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
// Now sort those heaps
sort_heap(v1.begin(),v1.end());
sort_heap(v2.begin(),v2.end(),less<int>());
// v1 = v2 = (1,2,3,4)
// Copy both vectors to cout
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
return 0;
}
Output :
4 2 3 1
4 3 2 1
3 2 1 4
3 1 2 4
4 3 1 2
4 3 2 1
1 2 3 4
1 2 3 4
WARNING
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int,allocator<int> >
instead of:
vector<int>
SEE ALSO
pop_heap, push_heap and sort_heap
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
max
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
max - Find and return the maximum of a pair of values
SYNOPSIS
#include <algorithm>
template <class T>
const T& max(const T&, const T&);
template <class T, class Compare>
const T& max(const T&, const T&, Compare);
DESCRIPTION
The max algorithm determines and returns the maximum of a pair of
values. The optional argument Compare defines a comparison function
that can be used in place of the default operator<. This
function can be used with all the datatypes provided by
the standard library.
max returns the first argument when the arguments are equal.
EXAMPLE
//
// max.cpp
//
#include <algorithm>
#include <iostream.h>
#include <iostream.h>
int main(void)
{
double d1 = 10.0, d2 = 20.0;
// Find minimum
double val1 = min(d1, d2);
// val1 = 10.0
// the greater comparator returns the greater of the
// two values.
double val2 = min(d1, d2, greater<double>());
// val2 = 20.0;
// Find maximum
double val3 = max(d1, d2);
// val3 = 20.0;
// the less comparator returns the smaller of the two values.
// Note that, like every comparison in the STL, max is
// defined in terms of the < operator, so using less here
// is the same as using the max algorithm with a default
// comparator.
double val4 = max(d1, d2, less<double>());
// val4 = 20
cout << val1 << " " << val2 << " "
<< val3 << " " << val4 << endl;
return 0;
}
Output :
10 20 20 20
SEE ALSO
max_element, min, min_element
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
max_element
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
max_element - Finds maximum value in a range.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator>
ForwardIterator
max_element(ForwardIterator first, ForwardIterator last);
template <class ForwardIterator, class Compare>
ForwardIterator
max_element(ForwardIterator first, ForwardIterator last,
Compare comp);
DESCRIPTION
The max_element algorithm returns an iterator that denotes the
maximum element in a sequence. If the sequence contains more
than one copy of the element, the iterator points to its first
occurrence. The optional argument comp defines a comparison
function that can be used in place of the default operator<. This
function can be used with all the datatypes provided by the
standard library.
Algorithm max_element returns the first iterator i in the range
[first, last) such that for any iterator j in the same range the
following corresponding conditions hold:
!(*i < *j)
or
comp(*i, *j) == false.
COMPLEXITY
Exactly max((last - first) - 1, 0) applications of the corresponding
comparisons are done for max_element.
EXAMPLE
//
// max_elem.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main(void)
{
typedef vector<int>::iterator iterator;
int d1[5] = {1,3,5,32,64};
// set up vector
vector<int> v1(d1,d1 + 5);
// find the largest element in the vector
iterator it1 = max_element(v1.begin(), v1.end());
// it1 = v1.begin() + 4
// find the largest element in the range from
// the beginning of the vector to the 2nd to last
iterator it2 = max_element(v1.begin(), v1.end()-1,
less<int>());
// it2 = v1.begin() + 3
// find the smallest element
iterator it3 = min_element(v1.begin(), v1.end());
// it3 = v1.begin()
// find the smallest value in the range from
// the beginning of the vector plus 1 to the end
iterator it4 = min_element(v1.begin()+1, v1.end(),
less<int>());
// it4 = v1.begin() + 1
cout << *it1 << " " << *it2 << " "
<< *it3 << " " << *it4 << endl;
return 0;
}
Output :
64 32 1 3
WARNING
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int,allocator<int> >
instead of:
vector<int>
SEE ALSO
max, min, min_element
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
merge
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
merge - Merge two sorted sequences into a third sequence.
SYNOPSIS
#include <algorithm>
template <class InputIterator1, class InputIterator2,
class OutputIterator>
OutputIterator
merge(InputIterator first1, InputIterator1 last1,
InputIterator2 first2, InputIterator last2,
OutputIterator result);
template <class InputIterator1, class InputIterator2,
class OutputIterator, class Compare>
OutputIterator
merge(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator last2,
OutputIterator result, Compare comp);
DESCRIPTION
The merge algorithm merges two sorted sequences, specified by
[first1, last1) and [first2, last2), into the sequence
specified by [result, result + (last1 - first1) + (last2 -
first2)). The first version of the merge algorithm uses the
less than operator (<) to compare elements in the two sequences.
The second version uses the comparison function provided by the
function call. If a comparison function is provided, merge assumes
that both sequences were sorted using that comparison function.
The merge is stable. This means that if the two original sequences
contain equivalent elements, the elements from the first sequence
will always precede the matching elements from the second in
the resulting sequence. The size of the result of a
merge is equal to the sum of the sizes of the two argument
sequences. merge returns an iterator that points to the end of the
resulting sequence, i.e., result + (last1 - first1) + (last2
-first2). The result of merge is undefined if the resulting
range overlaps with either of the original ranges.
merge assumes that there are at least (last1 - first1) + (last2 -
first2) elements following result, unless result has been adapted by
an insert iterator.
COMPLEXITY
For merge at most (last - first1) + (last2 - first2) - 1 comparisons
are performed.
EXAMPLE
//
// merge.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main()
{
int d1[4] = {1,2,3,4};
int d2[8] = {11,13,15,17,12,14,16,18};
// Set up two vectors
vector<int> v1(d1,d1 + 4), v2(d1,d1 + 4);
// Set up four destination vectors
vector<int> v3(d2,d2 + 8),v4(d2,d2 + 8),
v5(d2,d2 + 8),v6(d2,d2 + 8);
// Set up one empty vector
vector<int> v7;
// Merge v1 with v2
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v3.begin());
// Now use comparator
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v4.begin(),
less<int>());
// In place merge v5
vector<int>::iterator mid = v5.begin();
advance(mid,4);
inplace_merge(v5.begin(),mid,v5.end());
// Now use a comparator on v6
mid = v6.begin();
advance(mid,4);
inplace_merge(v6.begin(),mid,v6.end(),less<int>());
// Merge v1 and v2 to empty vector using insert iterator
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),
back_inserter(v7));
// Copy all cout
ostream_iterator<int,char> out(cout," ");
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
copy(v3.begin(),v3.end(),out);
cout << endl;
copy(v4.begin(),v4.end(),out);
cout << endl;
copy(v5.begin(),v5.end(),out);
cout << endl;
copy(v6.begin(),v6.end(),out);
cout << endl;
copy(v7.begin(),v7.end(),out);
cout << endl;
// Merge v1 and v2 to cout
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),
ostream_iterator<int,char>(cout," "));
cout << endl;
return 0;
}
Output :
1 2 3 4
1 2 3 4
1 1 2 2 3 3 4 4
1 1 2 2 3 3 4 4
11 12 13 14 15 16 17 18
11 12 13 14 15 16 17 18
1 1 2 2 3 3 4 4
1 1 2 2 3 3 4 4
WARNING
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int,allocator<int> >
instead of:
vector<int>
SEE ALSO
Containers, inplace_merge
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
min
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
min - Find and return the minimum of a pair of values
SYNOPSIS
#include <algorithm>
template <class T>
const T& min(const T&, const T&);
template <class T, class Compare>
const T& min(const T& a, const T&, Compare);
DESCRIPTION
The min algorithm determines and returns the minimum of a pair of
values. In the second version of the algorithm, the optional
argument Compare defines a comparison function that can be
used in place of the default operator<. This function can be
used with all the datatypes provided by the standard library.
min returns the first argument when the two arguments are equal.
EXAMPLE
//
// max.cpp
//
#include <algorithm>
#include <iostream.h>
int main(void)
{
double d1 = 10.0, d2 = 20.0;
// Find minimum
double val1 = min(d1, d2);
// val1 = 10.0
// the greater comparator returns the greater of the
// two values.
double val2 = min(d1, d2, greater<double>());
// val2 = 20.0;
// Find maximum
double val3 = max(d1, d2);
// val3 = 20.0;
// the less comparator returns the smaller of the
// two values.
// Note that, like every comparison in the STL, max is
// defined in terms of the < operator, so using less here
// is the same as using the max algorithm with a default
// comparator.
double val4 = max(d1, d2, less<double>());
// val4 = 20
cout << val1 << " " << val2 << " "
<< val3 << " " << val4 << endl;
return 0;
}
Output :
10 20 20 20
SEE ALSO
max, max_element, min_element
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
min_element
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
min_element - Finds the minimum value in a range.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator>
ForwardIterator
min_element(ForwardIterator first, ForwardIterator last);
template <class ForwardIterator, class Compare>
InputIterator
min_element(ForwardIterator first, ForwardIterator last,
Compare comp);
DESCRIPTION
The min_element algorithm returns an iterator that denotes the
minimum element in a sequence. If the sequence contains more
than one copy of the minimum element, the iterator points to the
first occurrence of the element. In the second version of the
function, the optional argument comp defines a comparison
function that can be used in place of the default operator<.
This function can be used with all the datatypes provided by the
standard library.
Algorithm min_element returns the first iterator i in the range
[first, last) such that for any iterator j in the range same range,
the following corresponding conditions hold:
!(*j < *i)
or
comp(*j, *i) == false.
COMPLEXITY
min_element performs exactly max((last - first) - 1, 0) applications
of the corresponding comparisons.
EXAMPLE
//
// max_elem.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main(void)
{
typedef vector<int>::iterator iterator;
int d1[5] = {1,3,5,32,64};
// set up vector
vector<int> v1(d1,d1 + 5);
// find the largest element in the vector
iterator it1 = max_element(v1.begin(), v1.end());
// it1 = v1.begin() + 4
// find the largest element in the range from
// the beginning of the vector to the 2nd to last
iterator it2 = max_element(v1.begin(), v1.end()-1,
less<int>());
// it2 = v1.begin() + 3
// find the smallest element
iterator it3 = min_element(v1.begin(), v1.end());
// it3 = v1.begin()
// find the smallest value in the range from
// the beginning of the vector plus 1 to the end
iterator it4 = min_element(v1.begin()+1, v1.end(),
less<int>());
// it4 = v1.begin() + 1
cout << *it1 << " " << *it2 << " "
<< *it3 << " " << *it4 << endl;
return 0;
}
Output :
64 32 1 3
WARNING
If your compiler does not support default template parameters then
you need to always supply the Allocator template argument. For
instance you'll have to write:
vector<int,allocator<int> >
instead of:
vector<int>
SEE ALSO
max, max_element, min
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
mismatch
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
mismatch - Compares elements from two sequences and returns the
first two elements that don't match each other.
SYNOPSIS
#include <algorithm>
template <class InputIterator1, class InputIterator2>
pair<InputIterator1,InputIterator2>
mismatch(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2);
template <class InputIterator1, class InputIterator2,
class BinaryPredicate>
pair<InputIterator1, Inputiterator2>
mismatch(InputIterator first1, InputIterator1 last1,
InputIterator2 first2,
BinaryPredicate binary_pred);
DESCRIPTION
The mismatch algorithm compares members of two sequences and returns
two iterators (i and j) that point to the first location in each
sequence where the sequences differ from each other.
Notice that the algorithm denotes both a starting position
and an ending position for the first sequence, but denotes only a
starting position for the second sequence. mismatch assumes that
the second sequence has at least as many members as the first
sequence. If the two sequences are identical, mismatch returns a
pair of iterators that point to the end of the first sequence and
the corresponding location at which the comparison stopped in
the second sequence.
The first version of mismatch checks members of a sequence for
equality, while the second version lets you specify a
comparison function. The comparison function must be a
binary predicate.
The iterators i and j returned by mismatch are defined as follows:
j == first2 + (i - first1)
and i is the first iterator in the range [first1, last1) for which the
appropriate one of the following conditions hold:
!(*i == *(first2 + (i - first1)))
or
binary_pred(*i, *(first2 + (i - first1))) == false
If all of the members in the two sequences match, mismatch returns a
pair of last1 and first2 + (last1 - first1).
COMPLEXITY
At most last1 - first1 applications of the corresponding predicate
are done.
EXAMPLE
//
// mismatch.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main(void)
{
typedef vector<int>::iterator iterator;
int d1[4] = {1,2,3,4};
int d2[4] = {1,3,2,4};
// Set up two vectors
vector<int> vi1(d1,d1 + 4), vi2(d2,d2 + 4);
// p1 will contain two iterators that point to the
// first pair of elements that are different between
// the two vectors
pair<iterator, iterator> p1 = mismatch(vi1.begin(), vi1.end(),
vi2.begin());
// find the first two elements such that an element in the
// first vector is greater than the element in the second
// vector.
pair<iterator, iterator> p2 = mismatch(vi1.begin(), vi1.end(),
vi2.begin(),
less_equal<int>());
// Output results
cout << *p1.first << ", " << *p1.second << endl;
cout << *p2.first << ", " << *p2.second << endl;
return 0;
}
Output :
2, 3
3, 2
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of:
vector<int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
next_permutation
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
next_permutation - Generate successive permutations of a sequence
based on an ordering function.
SYNOPSIS
#include <algorithm>
template <class BidirectionalIterator>
bool next_permutation (BidirectionalIterator first,
BidirectionalIterator last);
template <class BidirectionalIterator, class Compare>
bool next_permutation (BidirectionalIterator first,
BidirectionalIterator last, Compare comp);
DESCRIPTION
The permutation-generating algorithms (next_permutation and
prev_permutation) assume that the set of all permutations of the
elements in a sequence is lexicographically sorted with
respect to operator< or comp. So, for example, if a sequence
includes the integers 1 2 3, that sequence has six
permutations, which, in order from first to last are: 1 2 3 , 1
3 2, 2 1 3, 2 3 1, 3 1 2, and 3 2 1.
The next_permutation algorithm takes a sequence defined by the range
[first, last) and transforms it into its next permutation, if
possible. If such a permutation does exist, the algorithm completes
the transformation and returns true. If the permutation does
not exist, next_permutation returns false, and transforms the
permutation into its "first" permutation (according to the
lexicographical ordering defined by either operator<, the default
used in the first version of the algorithm, or comp, which is
user-supplied in the second version of the algorithm.)
For example, if the sequence defined by [first, last) contains the
integers 3 2 1 (in that order), there is not a "next
permutation." Therefore, the algorithm transforms the sequence
into its first permutation (1 2 3) and returns false.
COMPLEXITY
At most (last - first)/2 swaps are performed.
EXAMPLE
//
// permute.cpp
//
#include <numeric> //for accumulate
#include <vector> //for vector
#include <functional> //for less
#include <iostream.h>
int main()
{
//Initialize a vector using an array of ints
int a1[] = {0,0,0,0,1,0,0,0,0,0};
char a2[] = "abcdefghji";
//Create the initial set and copies for permuting
vector<int> m1(a1, a1+10);
vector<int> prev_m1((size_t)10), next_m1((size_t)10);
vector<char> m2(a2, a2+10);
vector<char> prev_m2((size_t)10), next_m2((size_t)10);
copy(m1.begin(), m1.end(), prev_m1.begin());
copy(m1.begin(), m1.end(), next_m1.begin());
copy(m2.begin(), m2.end(), prev_m2.begin());
copy(m2.begin(), m2.end(), next_m2.begin());
//Create permutations
prev_permutation(prev_m1.begin(),
prev_m1.end(),less<int>());
next_permutation(next_m1.begin(),
next_m1.end(),less<int>());
prev_permutation(prev_m2.begin(),
prev_m2.end(),less<int>());
next_permutation(next_m2.begin(),
next_m2.end(),less<int>());
//Output results
cout << "Example 1: " << endl << " ";
cout << "Original values: ";
copy(m1.begin(),m1.end(),
ostream_iterator<int,char>(cout," "));
cout << endl << " ";
cout << "Previous permutation: ";
copy(prev_m1.begin(),prev_m1.end(),
ostream_iterator<int,char>(cout," "));
cout << endl<< " ";
cout << "Next Permutation: ";
copy(next_m1.begin(),next_m1.end(),
ostream_iterator<int,char>(cout," "));
cout << endl << endl;
cout << "Example 2: " << endl << " ";
cout << "Original values: ";
copy(m2.begin(),m2.end(),
ostream_iterator<char,char>(cout," "));
cout << endl << " ";
cout << "Previous Permutation: ";
copy(prev_m2.begin(),prev_m2.end(),
ostream_iterator<char,char>(cout," "));
cout << endl << " ";
cout << "Next Permutation: ";
copy(next_m2.begin(),next_m2.end(),
ostream_iterator<char,char>(cout," "));
cout << endl << endl;
return 0;
}
Output :
Example 1:
Original values: 0 0 0 0 1 0 0 0 0 0
Previous permutation: 0 0 0 0 0 1 0 0 0 0
Next Permutation: 0 0 0 1 0 0 0 0 0 0
Example 2:
Original values: a b c d e f g h j i
Previous Permutation: a b c d e f g h i j
Next Permutation: a b c d e f g i h j
WARNING
If your compiler does not support default template parameters, the
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
prev_permutation
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
nth_element
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
nth_element - Rearranges a collection so that all elements lower in sorted
order than the nth element come before it and all elements higher in sorter
order than the nth element come after it.
SYNOPSIS
#include <algorithm>
template <class RandomAccessIterator>
void nth_element (RandomAccessIterator first,
RandomAccessIterator nth,
RandomAccessIterator last);
template <class RandomAccessIterator, class Compare>
void nth_element (RandomAccessIterator first,
RandomAccessIterator nth,
RandomAccessIterator last,
Compare comp);
DESCRIPTION
The nth_element algorithm rearranges a collection according to
either the default comparison operator (>) or the provided
comparison operator. After the algorithm applies, three things
are true:
+ The element that would be in the nth position if the
collection were completely sorted is in the nth position
+ All elements prior to the nth position would precede that
position in an ordered collection
+ All elements following the nth position would follow that
position in an ordered collection
That is, for any iterator i in the range [first, nth) and any
iterator j in the range [nth, last) it holds that !(*i > *j) or
comp(*i, *j) == false.
Note that the elements that precede or follow the nth position are
not necessarily sorted relative to each other. The nth_element
algorithm does not sort the entire collection.
COMPLEXITY
The algorithm is linear, on average, where N is the size of the range
[first, last).
EXAMPLE
//
// nthelem.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
template<class RandomAccessIterator>
void quik_sort(RandomAccessIterator start,
RandomAccessIterator end)
{
size_t dist = 0;
distance(start, end, dist);
//Stop condition for recursion
if(dist > 2)
{
//Use nth_element to do all the work for quik_sort
nth_element(start, start+(dist/2), end);
//Recursive calls to each remaining unsorted portion
quik_sort(start, start+(dist/2-1));
quik_sort(start+(dist/2+1), end);
}
if(dist == 2 && *end < *start)
swap(start, end);
}
int main()
{
//Initialize a vector using an array of ints
int arr[10] = {37, 12, 2, -5, 14, 1, 0, -1, 14, 32};
vector<int> v(arr, arr+10);
//Print the initial vector
cout << "The unsorted values are: " << endl << " ";
vector<int>::iterator i;
for(i = v.begin(); i != v.end(); i++)
cout << *i << ", ";
cout << endl << endl;
//Use the new sort algorithm
quik_sort(v.begin(), v.end());
//Output the sorted vector
cout << "The sorted values are: " << endl << " ";
for(i = v.begin(); i != v.end(); i++)
cout << *i << ", ";
cout << endl << endl;
return 0;
}
Output :
The unsorted values are:
37, 12, 2, -5, 14, 1, 0, -1, 14, 32,
The sorted values are:
-5, -1, 0, 1, 2, 12, 14, 14, 32, 37,
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
Algorithms
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
partial_sort
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
partial_sort - Templated algorithm for sorting collections of
entities.
SYNOPSIS
#include <algorithm>
template <class RandomAccessIterator>
void partial_sort (RandomAccessIterator first,
RandomAccessIterator middle,
RandomAccessIterator last);
template <class RandomAccessIterator, class Compare>
void partial_sort (RandomAccessIterator first,
RandomAccessIterator middle,
RandomAccessIterator last, Compare comp);
DESCRIPTION
The partial_sort algorithm takes the range [first,last) and places
the first middle - first values into sorted order. The result
is that the range [first, middle)is sorted like it would be if
the entire range [first,last) were sorted. The remaining
elements in the range (those in [middle, last)) are not in any
defined order. The first version of the algorithm uses less
than (operator<) as the comparison operator for the sort. The
second version uses the comparison function comp.
COMPLEXITY
partial_sort does approximately (last - first) * log(middle-first)
comparisons.
EXAMPLE
//
// partsort.cpp
//
#include <vector>
#include <algorithm>
#include <iostream.h>
int main()
{
int d1[20] = {17, 3, 5, -4, 1, 12, -10, -1, 14, 7,
-6, 8, 15, -11, 2, -2, 18, 4, -3, 0};
//
// Set up a vector.
//
vector<int> v1(d1+0, d1+20);
//
// Output original vector.
//
cout << "For the vector: ";
copy(v1.begin(), v1.end(),
ostream_iterator<int,char>(cout," "));
//
// Partial sort the first seven elements.
//
partial_sort(v1.begin(), v1.begin()+7, v1.end());
//
// Output result.
//
cout << endl << endl << "A partial_sort of seven elements
gives: "
<< endl << " ";
copy(v1.begin(), v1.end(),
ostream_iterator<int,char>(cout," "));
cout << endl;
//
// A vector of ten elements.
//
vector<int> v2(10, 0);
//
// Sort the last ten elements in v1 into v2.
//
partial_sort_copy(v1.begin()+10, v1.end(), v2.begin(),
v2.end());
//
// Output result.
//
cout << endl << "A partial_sort_copy of the last ten elements
gives: "
<< endl << " ";
copy(v2.begin(), v2.end(),
ostream_iterator<int,char>(cout," "));
cout << endl;
return 0;
}
Output :
For the vector: 17 3 5 -4 1 12 -10 -1 14 7 -6 8 15 -11 2 -2 18 4 -3 0
A partial_sort of seven elements gives:
-11 -10 -6 -4 -3 -2 -1 17 14 12 7 8 15 5 3 2 18 4 1 0
A partial_sort_copy of the last ten elements gives:
0 1 2 3 4 5 7 8 15 18
WARNING
If your compiler does not support default template parameters, then
you need to always provide the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
sort, stable_sort, partial_sort_copy
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
partial_sort_copy
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
partial_sort_copy - Templated algorithm for sorting collections of
entities.
SYNOPSIS
#include <algorithm>
template <class InputIterator,
class RandomAccessIterator>
void partial_sort_copy (InputIterator first,
InputIterator last,
RandomAccessIterator result_first,
RandomAccessIterator result_last);
template <class InputIterator,
class RandomAccessIterator,
class Compare>
void partial_sort_copy (InputIterator first,
InputIterator last,
RandomAccessIterator result_first,
RandomAccessIterator result_last,
Compare comp);
DESCRIPTION
The partial_sort_copy algorithm places the smaller of last - first
and result_last - result_first sorted elements from the range
[first, last) into the range beginning at result_first. (i.e., the
range: [result_first, result_first+min(last - first, result_last -
result_first)). Basically, the effect is as if the
range [first,last) were placed in a temporary buffer, sorted and
then as many elements as possible were copied into the range
[result_first, result_last).
The first version of the algorithm uses less than (operator<) as the
comparison operator for the sort. The second version uses the
comparison function comp.
COMPLEXITY
partial_sort_copy does approximately (last-first) * log(min(last-first,
result_last-result_first)) comparisons.
EXAMPLE
//
// partsort.cpp
// #include <vector>
#include <algorithm>
#include <iostream.h>
int main()
{
int d1[20] = {17, 3, 5, -4, 1, 12, -10, -1, 14, 7,
-6, 8, 15, -11, 2, -2, 18, 4, -3, 0};
//
// Set up a vector.
//
vector<int> v1(d1+0, d1+20);
//
// Output original vector.
//
cout << "For the vector: ";
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout," "));
//
// Partial sort the first seven elements.
//
partial_sort(v1.begin(), v1.begin()+7, v1.end());
//
// Output result.
//
cout << endl << endl << "A partial_sort of 7 elements gives: "
<< endl << " ";
copy(v1.begin(), v1.end(),
ostream_iterator<int,char>(cout," "));
cout << endl;
//
// A vector of ten elements.
//
vector<int> v2(10, 0);
//
// Sort the last ten elements in v1 into v2.
//
partial_sort_copy(v1.begin()+10, v1.end(), v2.begin(),
v2.end());
//
// Output result.
//
cout << endl << "A partial_sort_copy of the last ten elements
gives: " << endl << " ";
copy(v2.begin(), v2.end(),
ostream_iterator<int,char>(cout," "));
cout << endl;
return 0;
}
Output :
For the vector: 17 3 5 -4 1 12 -10 -1 14 7 -6 8 15 -11 2 -2 18 4 -3 0
A partial_sort of seven elements gives:
-11 -10 -6 -4 -3 -2 -1 17 14 12 7 8 15 5 3 2 18 4 1 0
A partial_sort_copy of the last ten elements gives:
0 1 2 3 4 5 7 8 15 18
WARNING
If your compiler does not support default template parameters, then
you need to always provide the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
sort_ stable_sort, partial_sort
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
partial_sum
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
partial_sum - Calculates successive partial sums of a range of values.
SYNOPSIS
#include <numeric>
template <class InputIterator, class OutputIterator>
OutputIterator partial_sum (InputIterator first,
InputIterator last,
OutputIterator result);
template <class InputIterator,
class OutputIterator,
class BinaryOperation>
OutputIterator partial_sum (InputIterator first,
InputIterator last,
OutputIterator result,
BinaryOperation binary_op);
DESCRIPTION
The partial_sum algorithm creates a new sequence in which every
element is formed by adding all the values of the previous elements,
or, in the second form of the algorithm, applying the operation
binary_op successively on every previous element. That is,
partial_sum assigns to every iterator i in the range [result,
result + (last - first)) a value equal to:
((...(*first + *(first + 1)) + ... ) + *(first + (i - result)))
or, in the second version of the algorithm:
binary_op(binary_op(..., binary_op (*first, *(first +
1)),...),*(first + (i - result)))
For instance, applying partial_sum to (1,2,3,4,) will yield
(1,3,6,10).
The partial_sum algorithm returns result + (last - first).
If result is equal to first, the elements of the new sequence
successively replace the elements in the original sequence,
effectively turning partial_sum into an inplace transformation.
COMPLEXITY
Exactly (last - first) - 1 applications of the default + operator or
binary_op are performed.
EXAMPLE
//
// partsum.cpp
//
#include <numeric> //for accumulate
#include <vector> //for vector
#include <functional> //for times
#include <iostream.h>
int main()
{
//Initialize a vector using an array of ints
int d1[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> v(d1, d1+10);
//Create an empty vectors to store results
vector<int> sums((size_t)10), prods((size_t)10);
//Compute partial_sums and partial_products
partial_sum(v.begin(), v.end(), sums.begin());
partial_sum(v.begin(), v.end(), prods.begin(), times<int>());
//Output the results
cout << "For the series: " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
cout << "The partial sums: " << endl << " " ;
copy(sums.begin(),sums.end(),
ostream_iterator<int,char>(cout," "));
cout <<" should each equal (N*N + N)/2" << endl << endl;
cout << "The partial products: " << endl << " ";
copy(prods.begin(),prods.end(),
ostream_iterator<int,char>(cout," "));
cout << " should each equal N!" << endl;
return 0;
}
Output :
For the series:
1 2 3 4 5 6 7 8 9 10
The partial sums:
1 3 6 10 15 21 28 36 45 55 should each equal (N*N + N)/2
The partial products:
1 2 6 24 120 720 5040 40320 362880 3628800 should each equal N!
WARNING
If your compiler does not support default template parameters, then
you need to always provide the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
partition
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
partition - Places all of the entities that satisfy the given
predicate before all of the entities that do not.
SYNOPSIS
#include <algorithm>
template <class BidirectionalIterator, class Predicate>
BidirectionalIterator
partition (BidirectionalIterator first,
BidirectionalIterator last,
Predicate pred);
DESCRIPTION
The partition algorithm places all the elements in the range [first,
last) that satisfy pred before all the elements that do not
satisfy pred. It returns an iterator that is one past the end
of the group of elements that satisfy pred. In other
words, partition returns i such that for any itera- tor j in the
range[first, i), pred(*j) == true, and, for any iterator k in
the range [i, last), pred(*j) == false.
Note that partition does not necessarily maintain the relative order
of the elements that match and elements that do not match the
predicate. Use the algorithm stable_partition if relative order
is important.
COMPLEXITY
The partition algorithm does at most (last - first)/2 swaps, and
applies the predicate exactly last - first times.
EXAMPLE
//
// prtition.cpp
//
#include <functional>
#include <deque>
#include <algorithm>
#include <iostream.h>
//
// Create a new predicate from unary_function.
//
template<class Arg>
class is_even : public unary_function<Arg, bool>
{
public:
bool operator()(const Arg& arg1) { return (arg1 % 2) == 0; }
};
int main ()
{
//
// Initialize a deque with an array of integers.
//
int init[10] = { 1,2,3,4,5,6,7,8,9,10 };
deque<int> d1(init+0, init+10);
deque<int> d2(init+0, init+10);
//
// Print out the original values.
//
cout << "Unpartitioned values: " << "";
copy(d1.begin(), d1.end(),
ostream_iterator<int,char>(cout," "));
cout << endl;
//
// A partition of the deque according to even/oddness.
//
partition(d2.begin(), d2.end(), is_even<int>());
//
// Output result of partition.
//
cout << "Partitioned values: " << "";
copy(d2.begin(), d2.end(),
ostream_iterator<int,char>(cout," "));
cout << endl;
//
// A stable partition of the deque according to even/oddness.
//
stable_partition(d1.begin(), d1.end(), is_even<int>());
//
// Output result of partition.
//
cout << "Stable partitioned values: " << "";
copy(d1.begin(), d1.end(),
ostream_iterator<int,char>(cout," "));
cout << endl;
return 0;
}
Output :
Unpartitioned values: 1 2 3 4 5 6 7 8 9 10
Partitioned values: 10 2 8 4 6 5 7 3 9 1
Stable partitioned values: 2 4 6 8 10 1 3 5 7 9
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you need to write :
deque<int, allocator<int> >
instead of :
deque<int>
SEE ALSO
stable_partition
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
permutation
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
permutation - Generate successive permutations of a sequence based
on an ordering function.
See the entries for next_permutation and prev_permutation.
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
pop_heap
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
pop_heap - Moves the largest element off the heap.
SYNOPSIS
template <class RandomAccessIterator>
void
pop_heap(RandomAccessIterator first,
RandomAccessIterator last);
template <class RandomAccessIterator, class Compare>
void
pop_heap(RandomAccessIterator first,
RandomAccessIterator last, Compare comp);
DESCRIPTION
A heap is a particular organization of elements in a range between
two random access iterators [a, b). Its two key properties are:
1. *a is the largest element in the range.
2. *a may be removed by the pop_heap algorithm or a new element added
by the push_heap algorithm, in O(logN) time.
These properties make heaps useful as priority queues.
The pop_heap algorithm uses the less than (<) operator as the
default comparison. An alternate comparison operator can be
specified.
The pop_heap algorithm can be used as part of an operation to remove
the largest element from a heap. It assumes that the range
[first, last) is a valid heap (i.e., that first is the largest
element in the heap or the first element based on the alternate
comparison operator). It then swaps the value in the location first
with the value in the location last - 1 and makes [first, last
-1)back into a heap. You can then access the element in last
using the vector or deque back() member function, or remove the
element using the pop_back member function. Note that pop_heap does
not actually remove the element from the data structure, you must
use another function to do that.
COMPLEXITY
pop_heap performs at most 2 * log(last - first) comparisons.
EXAMPLE
//
// heap_ops.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main(void)
{
int d1[4] = {1,2,3,4};
int d2[4] = {1,3,2,4};
// Set up two vectors
vector<int> v1(d1,d1 + 4), v2(d2,d2 + 4);
// Make heaps
make_heap(v1.begin(),v1.end());
make_heap(v2.begin(),v2.end(),less<int>());
// v1 = (4,x,y,z) and v2 = (4,x,y,z)
// Note that x, y and z represent the remaining
// values in the container (other than 4).
// The definition of the heap and heap operations
// does not require any particular ordering
// of these values.
// Copy both vectors to cout
ostream_iterator<int,char> out(cout," ");
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
// Now let's pop
pop_heap(v1.begin(),v1.end());
pop_heap(v2.begin(),v2.end(),less<int>());
// v1 = (3,x,y,4) and v2 = (3,x,y,4)
// Copy both vectors to cout
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
// And push
push_heap(v1.begin(),v1.end());
push_heap(v2.begin(),v2.end(),less<int>());
// v1 = (4,x,y,z) and v2 = (4,x,y,z)
// Copy both vectors to cout
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
// Now sort those heaps
sort_heap(v1.begin(),v1.end());
sort_heap(v2.begin(),v2.end(),less<int>());
// v1 = v2 = (1,2,3,4)
// Copy both vectors to cout
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
return 0;
}
Output :
4 2 3 1
4 3 2 1
3 2 1 4
3 1 2 4
4 3 1 2
4 3 2 1
1 2 3 4
1 2 3 4
WARNING
If your compiler does not support default template parameters, you
need to always supply the Allocator template argument. For
instance, you need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
make_heap, push_heap, sort_heap
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
prev_permutation
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
prev_permutation - Generate successive permutations of a sequence
based on an ordering function.
SYNOPSIS
#include <algorithm>
template <class BidirectionalIterator>
bool prev_permutation (BidirectionalIterator first,
BidirectionalIterator last);
template <class BidirectionalIterator, class Compare>
bool prev_permutation (BidirectionalIterator first,
BidirectionalIterator last, Compare comp);
DESCRIPTION
The permutation-generating algorithms (next_permutation and
prev_permutation) assume that the set of all permutations of the
elements in a sequence is lexicographically sorted with
respect to operator< or comp. So, for example, if a sequence
includes the integers 1 2 3, that sequence has six
permutations, which, in order from first to last, are: 1 2 3 ,
1 3 2, 2 1 3, 2 3 1, 3 1 2, and 3 2 1.
The prev_permutation algorithm takes a sequence defined by the range
[first, last) and transforms it into its previous permutation, if
possible. If such a permutation does exist, the algorithm
completes the transformation and returns true. If the permutation
does not exist, prev_permutation returns false, and transforms
the permutation into its "last" permutation (according to
the lexicographical ordering defined by either operator <, the
default used in the first version of the algorithm, or comp,
which is user-supplied in the second version of the
algorithm.)
For example, if the sequence defined by [first, last) contains the
integers 1 2 3 (in that order), there is not a "previous
permutation." Therefore, the algorithm transforms the
sequence into its last permutation (3 2 1) and returns false.
COMPLEXITY
At most (last - first)/2 swaps are performed.
EXAMPLE
//
// permute.cpp
//
#include <numeric> //for accumulate
#include <vector> //for vector
#include <functional> //for less
#include <iostream.h>
int main()
{
//Initialize a vector using an array of ints
int a1[] = {0,0,0,0,1,0,0,0,0,0};
char a2[] = "abcdefghji";
//Create the initial set and copies for permuting
vector<int> m1(a1, a1+10);
vector<int> prev_m1((size_t)10), next_m1((size_t)10);
vector<char> m2(a2, a2+10);
vector<char> prev_m2((size_t)10), next_m2((size_t)10);
copy(m1.begin(), m1.end(), prev_m1.begin());
copy(m1.begin(), m1.end(), next_m1.begin());
copy(m2.begin(), m2.end(), prev_m2.begin());
copy(m2.begin(), m2.end(), next_m2.begin());
//Create permutations
prev_permutation(prev_m1.begin(),
prev_m1.end(),less<int>());
next_permutation(next_m1.begin(),
next_m1.end(),less<int>());
prev_permutation(prev_m2.begin(),
prev_m2.end(),less<int>());
next_permutation(next_m2.begin(),
next_m2.end(),less<int>());
//Output results
cout << "Example 1: " << endl << " ";
cout << "Original values: ";
copy(m1.begin(),m1.end(),
ostream_iterator<int,char>(cout," "));
cout << endl << " ";
cout << "Previous permutation: ";
copy(prev_m1.begin(),prev_m1.end(),
ostream_iterator<int,char>(cout," "));
cout << endl<< " ";
cout << "Next Permutation: ";
copy(next_m1.begin(),next_m1.end(),
ostream_iterator<int,char>(cout," "));
cout << endl << endl;
cout << "Example 2: " << endl << " ";
cout << "Original values: ";
copy(m2.begin(),m2.end(),
ostream_iterator<char,char>(cout," "));
cout << endl << " ";
cout << "Previous Permutation: ";
copy(prev_m2.begin(),prev_m2.end(),
ostream_iterator<char,char>(cout," "));
cout << endl << " ";
cout << "Next Permutation: ";
copy(next_m2.begin(),next_m2.end(),
ostream_iterator<char,char>(cout," "));
cout << endl << endl;
return 0;
}
Output :
Example 1:
Original values: 0 0 0 0 1 0 0 0 0 0
Previous permutation: 0 0 0 0 0 1 0 0 0 0
Next Permutation: 0 0 0 1 0 0 0 0 0 0
Example 2:
Original values: a b c d e f g h j i
Previous Permutation: a b c d e f g h i j
Next Permutation: a b c d e f g i h j
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
next_permutation
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
push_heap
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
push_heap - Places a new element into a heap.
SYNOPSIS
#include <algorithm>
template <class RandomAccessIterator>
void
push_heap(RandomAccessIterator first,
RandomAccessIterator last);
template <class RandomAccessIterator, class Compare>
void
push_heap(RandomAccessIterator first,
RandomAccessIterator last, Compare comp);
DESCRIPTION
A heap is a particular organization of elements in a range between
two random access iterators [a, b). Its two key properties are:
1. *a is the largest element in the range.
2. *a may be removed by the pop_heap algorithm, or a new element
added by the push_heap algorithm, in O(logN) time.
These properties make heaps useful as priority queues.
The push_heap algorithms uses the less than (<) operator as the
default comparison. As with all of the heap manipulation
algorithms, an alternate comparison function can be specified.
The push_heap algorithm is used to add a new element to the heap.
First, a new element for the heap is added to the end of a range.
(For example, you can use the vector or deque member function
push_back()to add the element to the end of either of
those containers.) The push_heap algorithm assumes that the range
[first, last - 1) is a valid heap. It then properly posi-
tions the element in the location last - 1 into its proper position
in the heap, resulting in a heap over the range [first, last).
Note that the push_heap algorithm does not place an element into the
heap's underlying container. You must user another function to add
the element to the end of the container before applying push_heap.
COMPLEXITY
For push_heap at most log(last - first) comparisons are performed.
EXAMPLE
//
// heap_ops.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main(void)
{
int d1[4] = {1,2,3,4};
int d2[4] = {1,3,2,4};
// Set up two vectors
vector<int> v1(d1,d1 + 4), v2(d2,d2 + 4);
// Make heaps
make_heap(v1.begin(),v1.end());
make_heap(v2.begin(),v2.end(),less<int>());
// v1 = (4,x,y,z) and v2 = (4,x,y,z)
// Note that x, y and z represent the remaining
// values in the container (other than 4).
// The definition of the heap and heap operations
// does not require any particular ordering
// of these values.
// Copy both vectors to cout
ostream_iterator<int,char> out(cout," ");
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
// Now let's pop
pop_heap(v1.begin(),v1.end());
pop_heap(v2.begin(),v2.end(),less<int>());
// v1 = (3,x,y,4) and v2 = (3,x,y,4)
// Copy both vectors to cout
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
// And push
push_heap(v1.begin(),v1.end());
push_heap(v2.begin(),v2.end(),less<int>());
// v1 = (4,x,y,z) and v2 = (4,x,y,z)
// Copy both vectors to cout
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
// Now sort those heaps
sort_heap(v1.begin(),v1.end());
sort_heap(v2.begin(),v2.end(),less<int>());
// v1 = v2 = (1,2,3,4)
// Copy both vectors to cout
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
return 0;
}
Output :
4 2 3 1
4 3 2 1
3 2 1 4
3 1 2 4
4 3 1 2
4 3 2 1
1 2 3 4
1 2 3 4
WARNING
If your compiler does not support default template parameters, you
need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
make_heap, pop_heap, sort_heap
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
random_shuffle
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
random_shuffle - Randomly shuffles elements of a collection.
SYNOPSIS
#include <algorithm>
template <class RandomAccessIterator>
void random_shuffle (RandomAccessIterator first,
RandomAccessIterator last);
template <class RandomAccessIterator,
class RandomNumberGenerator>
void random_shuffle (RandomAccessIterator first,
RandomAccessIterator last,
RandomNumberGenerator& rand);
DESCRIPTION
The random_shuffle algorithm shuffles the elements in the range
[first, last) with uniform distribution. random_shuffle can take a
particular random number generating function object rand ,
where rand takes a positive argument n of distance type
of the RandomAccessIterator and returns a randomly chosen
value between 0 and n - 1.
COMPLEXITY
In the random_shuffle algorithm, (last - first) -1 swaps are done.
EXAMPLE
//
// rndshufl.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main()
{
//Initialize a vector with an array of ints
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> v(arr, arr+10);
//Print out elements in original (sorted) order
cout << "Elements before random_shuffle: " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//Mix them up with random_shuffle
random_shuffle(v.begin(), v.end());
//Print out the mixed up elements
cout << "Elements after random_shuffle: " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl;
return 0;
}
Output :
Elements before random_shuffle:
1 2 3 4 5 6 7 8 9 10
Elements after random_shuffle:
7 9 10 3 2 5 4 8 1 6
WARNING
If your compiler does not support default template parameters, you
need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
remove
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
remove - Move desired elements to the front of a container, and
return an iterator that describes where the sequence of
desired elements ends.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator, class T>
ForwardIterator
remove (ForwardIterator first,
ForwardIterator last,
const T& value);
DESCRIPTION
The remove algorithm eliminates all the elements referred to by
iterator i in the range [first, last) for which the following
condition holds: *i == value. remove returns an iterator that
designates the end of the resulting range. remove is
stable, that is, the relative order of the elements that are
not removed is the same as their relative order in the original
range.
remove does not actually reduce the size of the sequence. It
actually operates by: 1) copying the values that are to be retained
to the front of the sequence, and 2) returning an iterator that
describes where the sequence of retained values ends. Elements that
are after this iterator are simply the original sequence values,
left unchanged. Here's a simple example:
Say we want to remove all values of "2" from the following sequence:
354621271
Applying the remove algorithm results in the following sequence:
3546171|XX
The vertical bar represents the position of the iterator returned by
remove. Note that the elements to the left of the vertical bar are
the original sequence with the "2's" removed.
If you want to actually delete items from the container, use the
following technique:
container.erase(remove(first,last,value),container.end());
COMPLEXITY
Exactly last1 - first1 applications of the corresponding predicate are
done.
EXAMPLE
//
// remove.cpp
//
#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream.h>
template<class Arg>
struct all_true : public unary_function<Arg, bool>
{
bool operator()(const Arg& x){ return 1; }
};
int main ()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> v(arr, arr+10);
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
// remove the 7
vector<int>::iterator result =
remove(v.begin(), v.end(), 7);
// delete dangling elements from the vector
v.erase(result, v.end());
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
// remove everything beyond the fourth element
result = remove_if(v.begin()+4,
v.begin()+8, all_true<int>());
// delete dangling elements
v.erase(result, v.end());
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
return 0;
}
Output :
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 8 9 10
1 2 3 4
1 2 4
WARNING
If your compiler does not support default template parameters, you
need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
remove_if, remove_copy, remove_copy_if
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
remove_copy
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
remove_copy - Move desired elements to the front of a container,
and return an iterator that describes where the sequence of desired
elements ends.
SYNOPSIS
#include <algorithm>
template <class InputIterator,
class OutputIterator,
class T>
OutputIterator remove_copy (InputIterator first,
InputIterator last,
OutputIterator result,
const T& value);
DESCRIPTION
The remove_copy algorithm copies all the elements referred to by the
iterator i in the range [first, last) for which the following
corresponding condition does not hold: *i == value.
remove_copy returns the end of the resulting range.
remove_copy is stable, that is, the relative order of the elements
in the resulting range is the same as their relative order in the
original range. The elements in the original sequence are not
altered by remove_copy.
COMPLEXITY
Exactly last1 - first1 applications of the corresponding predicate are
done.
EXAMPLE
//
// remove.cpp
//
#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream.h>
template<class Arg>
struct all_true : public unary_function<Arg, bool>
{
bool operator() (const Arg&) { return 1; }
};
int main ()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> v(arr+0, arr+10);
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//
// Remove the 7.
//
vector<int>::iterator result = remove(v.begin(), v.end(), 7);
//
// Delete dangling elements from the vector.
//
v.erase(result, v.end());
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//
// Remove everything beyond the fourth element.
//
result = remove_if(v.begin()+4, v.begin()+8, all_true<int>());
//
// Delete dangling elements.
//
v.erase(result, v.end());
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//
// Now remove all 3s on output.
//
remove_copy(v.begin(), v.end(),
ostream_iterator<int,char>(cout," "), 3);
cout << endl << endl;
//
// Now remove everything satisfying predicate on output.
// Should yield a NULL vector.
//
remove_copy_if(v.begin(), v.end(),
ostream_iterator<int,char>(cout," "),
all_true<int>());
return 0;
}
Output :
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 8 9 10
1 2 3 4
1 2 4
WARNING
If your compiler does not support default template parameters, you
need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
remove, remove_if, remove_copy_if
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
remove_copy_if
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
remove_copy_if - Move desired elements to the front of a container,
and return an iterator that describes where the sequence of desired
elements ends.
SYNOPSIS
#include <algorithm>
template <class InputIterator,
class OutputIterator,
class Predicate>
OutputIterator remove_copy_if (InputIterator first,
InputIterator last,
OutputIterator result,
Predicate pred);
DESCRIPTION
The remove_copy_if algorithm copies all the elements referred to by
the iterator i in the range [first, last) for which the
following condition does not hold: pred(*i) == true.
remove_copy_if returns the end of the resulting range.
remove_copy_if is stable, that is, the relative order of the
elements in the resulting range is the same as their relative
order in the original range.
COMPLEXITY
Exactly last1 - first1 applications of the corresponding predicate are
done.
EXAMPLE
//
// remove.cpp
//
#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream.h>
template<class Arg>
struct all_true : public unary_function<Arg, bool>
{
bool operator() (const Arg&) { return 1; }
};
int main ()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> v(arr+0, arr+10);
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//
// Remove the 7.
//
vector<int>::iterator result = remove(v.begin(), v.end(), 7);
//
// Delete dangling elements from the vector.
//
v.erase(result, v.end());
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//
// Remove everything beyond the fourth element.
//
result = remove_if(v.begin()+4, v.begin()+8, all_true<int>());
//
// Delete dangling elements.
//
v.erase(result, v.end());
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//
// Now remove all 3s on output.
//
remove_copy(v.begin(), v.end(),
ostream_iterator<int>(cout," "), 3);
cout << endl << endl;
//
// Now remove everything satisfying predicate on output.
// Should yield a NULL vector.
//
remove_copy_if(v.begin(), v.end(),
ostream_iterator<int,char>(cout," "),
all_true<int>());
return 0;
}
Output :
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 8 9 10
1 2 3 4
1 2 4
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
remove, remove_if, remove_copy
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
remove_if
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
remove_if - Move desired elements to the front of a container, and
return an iterator that describes where the sequence of desired
elements ends.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator, class Predicate>
ForwardIterator remove_if (ForwardIterator first,
ForwardIterator last,
Predicate pred);
DESCRIPTION
The remove_if algorithm eliminates all the elements referred to by
iterator i in the range [first, last) for which the following
corresponding condition holds: pred(*i) == true. remove_if
returns the end of the resulting range. remove_if is stable, that
is, the relative order of the elements that are not removed is the
same as their relative order in the original range.
remove_if does not actually reduce the size of the sequence. It
actually operates by: 1) copying the values that are to be retained
to the front of the sequence, and 2) returning an iterator that
describes where the sequence of retained values ends. Elements that
are after this iterator are simply the original sequence values,
left unchanged. Here's a simple example:
Say we want to remove all even numbers from the following sequence:
123456789
Applying the remove_if algorithm results in the following sequence:
13579|XXXX
The vertical bar represents the position of the iterator returned by
remove_if. Note that the elements to the left of the vertical bar
are the original sequence with the even numbers removed. The
elements to the right of the bar are simply the untouched
original members of the original sequence.
If you want to actually delete items from the container, use the following
technique:
container.erase(remove(first,last,value),container.end());
COMPLEXITY
Exactly last1 - first1 applications of the corresponding predicate are
done.
EXAMPLE
//
// remove.cpp
//
#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream.h>
template<class Arg>
struct all_true : public unary_function<Arg, bool>
{
bool operator()(const Arg& x){ return 1; }
};
int main ()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> v(arr, arr+10);
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
// remove the 7
vector<int>::iterator result =
remove(v.begin(), v.end(), 7);
// delete dangling elements from the vector
v.erase(result, v.end());
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
// remove everything beyond the fourth element
result = remove_if(v.begin()+4,
v.begin()+8, all_true<int>());
// delete dangling elements
v.erase(result, v.end());
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
return 0;
}
Output :
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 8 9 10
1 2 3 4
1 2 4
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
remove, remove_copy, remove_copy_if
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
replace
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
replace - Substitutes elements stored in a collection with new
values.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator, class T>
void replace (ForwardIterator first,
ForwardIterator last,
const T& old_value,
const T& new_value);
DESCRIPTION
The replace algorithm replaces elements referred to by iterator i in
the range [first, last) with new_value when the following
condition holds: *i == old_value
COMPLEXITY
Exactly last - first comparisons or applications of the
corresponding predicate are done.
EXAMPLE
//
// replace.cpp
//
#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream.h>
template<class Arg>
struct all_true : public unary_function<Arg, bool>
{
bool operator()(const Arg&){ return 1; }
};
int main()
{
//Initialize a vector with an array of integers
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> v(arr, arr+10);
//Print out original vector
cout << "The original list: " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//Replace the number 7 with 11
replace(v.begin(), v.end(), 7, 11);
// Print out vector with 7 replaced,
// s.b. 1 2 3 4 5 6 11 8 9 10
cout << "List after replace " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//Replace 1 2 3 with 13 13 13
replace_if(v.begin(), v.begin()+3, all_true<int>(), 13);
// Print out the remaining vector,
// s.b. 13 13 13 4 5 6 11 8 9 10
cout << "List after replace_if " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
return 0;
}
Output :
The original list:
1 2 3 4 5 6 7 8 9 10
List after replace:
1 2 3 4 5 6 11 8 9 10
List after replace_if:
13 13 13 4 5 6 11 8 9 10
List using replace_copy to cout:
17 17 17 4 5 6 11 8 9 10
List with all elements output as 19s:
19 19 19 19 19 19 19 19 19 19
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
replace_if, replace_copy, replace_copy_if
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
replace_copy
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
replace_copy - Substitutes elements stored in a collection with new
values.
SYNOPSIS
#include <algorithm>
template <class InputIterator,
class OutputIterator,
class T>
OutputIterator replace_copy (InputIterator first,
InputIterator last,
OutputIterator result,
const T& old_value,
const T& new_value);
DESCRIPTION
The replace_copy algorithm leaves the original sequence intact and
places the revised sequence into result. The algorithm compares
elements referred to by iterator i in the range [first, last)
with old_value. If *i does not equal old_value, then the
replace_copy copies *i to result+(first-i). If *i==old_value,
then replace_copy copies new_value to result+(first-i). replace_copy
returns result+(last-first).
COMPLEXITY
Exactly last - first comparisons between values are done.
EXAMPLE
//
// replace.cpp
//
#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream.h>
template<class Arg>
struct all_true : public unary_function<Arg, bool>
{
bool operator() (const Arg&) { return 1; }
};
int main ()
{
//
// Initialize a vector with an array of integers.
//
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
vector<int> v(arr+0, arr+10);
//
// Print out original vector.
//
cout << "The original list: " << endl << " ";
copy(v.begin(), v.end(), ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//
// Replace the number 7 with 11.
//
replace(v.begin(), v.end(), 7, 11);
//
// Print out vector with 7 replaced.
//
cout << "List after replace:" << endl << " ";
copy(v.begin(), v.end(), ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//
// Replace 1 2 3 with 13 13 13.
//
replace_if(v.begin(), v.begin()+3, all_true<int>(), 13);
//
// Print out the remaining vector.
//
cout << "List after replace_if:" << endl << " ";
copy(v.begin(), v.end(), ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//
// Replace those 13s with 17s on output.
//
cout << "List using replace_copy to cout:" << endl << " ";
replace_copy(v.begin(), v.end(),
ostream_iterator<int,char>(cout, " "), 13, 17);
cout << endl << endl;
//
// A simple example of replace_copy_if.
//
cout << "List w/ all elements output as 19s:" << endl << " ";
replace_copy_if(v.begin(), v.end(),
ostream_iterator<int,char>(cout, " "),
all_true<int>(), 19);
cout << endl;
return 0;
}
Output :
The original list:
1 2 3 4 5 6 7 8 9 10
List after replace:
1 2 3 4 5 6 11 8 9 10
List after replace_if:
13 13 13 4 5 6 11 8 9 10
List using replace_copy to cout:
17 17 17 4 5 6 11 8 9 10
List with all elements output as 19s:
19 19 19 19 19 19 19 19 19 19
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
replace, replace_if, replace_copy_if
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
replace_copy_if
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
replace_copy_if - Substitutes elements stored in a collection with
new values.
SYNOPSIS
#include <algorithm>
template <class InputIterator,
class OutputIterator,
class Predicate,
class T>
OutputIterator replace_copy_if (InputIterator first,
InputIterator last,
OutputIterator result,
Predicate pred,
const T& new_value);
DESCRIPTION
The replace_copy_if algorithm leaves the original sequence intact
and places a revised sequence into result. The algorithm
compares each element *i in the range [first,last) with the
conditions specified by pred. If pred(*i)==false,
replace_copy_if copies *i to result+(first-i). If pred(*i)==true,
then replace_copy copies new_value to result+(first-i).
replace_copy_if returns result+(last-first).
COMPLEXITY
Exactly last - first applications of the predicate are performed.
EXAMPLE
//
// replace.cpp
//
#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream.h>
template<class Arg>
struct all_true : public unary_function<Arg, bool>
{
bool operator() (const Arg&) { return 1; }
};
int main ()
{
//
// Initialize a vector with an array of integers.
//
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
vector<int> v(arr+0, arr+10);
//
// Print out original vector.
//
cout << "The original list: " << endl << " ";
copy(v.begin(), v.end(), ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//
// Replace the number 7 with 11.
//
replace(v.begin(), v.end(), 7, 11);
//
// Print out vector with 7 replaced.
//
cout << "List after replace:" << endl << " ";
copy(v.begin(), v.end(), ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//
// Replace 1 2 3 with 13 13 13.
//
replace_if(v.begin(), v.begin()+3, all_true<int>(), 13);
//
// Print out the remaining vector.
//
cout << "List after replace_if:" << endl << " ";
copy(v.begin(), v.end(), ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//
// Replace those 13s with 17s on output.
//
cout << "List using replace_copy to cout:" << endl << " ";
replace_copy(v.begin(), v.end(),
ostream_iterator<int,char>(cout, " "), 13, 17);
cout << endl << endl;
//
// A simple example of replace_copy_if.
//
cout << "List w/ all elements output as 19s:" << endl << " ";
replace_copy_if(v.begin(), v.end(),
ostream_iterator<int,char>(cout, " "),
all_true<int>(), 19);
cout << endl;
return 0;
}
Output :
The original list:
1 2 3 4 5 6 7 8 9 10
List after replace:
1 2 3 4 5 6 11 8 9 10
List after replace_if:
13 13 13 4 5 6 11 8 9 10
List using replace_copy to cout:
17 17 17 4 5 6 11 8 9 10
List with all elements output as 19s:
19 19 19 19 19 19 19 19 19 19
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
replace, replace_if, replace_copy
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
replace_if
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
replace_if - Substitutes elements stored in a collection with new
values.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator,
class Predicate,
class T>
void replace_if (ForwardIterator first,
ForwardIterator last,
Predicate pred
const T& new_value);
DESCRIPTION
The replace_if algorithm replaces element referred to by iterator i
in the range [first, last) with new_value when the following
condition holds: pred(*i) == true.
COMPLEXITY
Exactly last - first applications of the predicate are done.
EXAMPLE
//
// replace.cpp
//
#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream.h>
template<class Arg>
struct all_true : public unary_function<Arg, bool>
{
bool operator()(const Arg&){ return 1; }
};
int main()
{
//Initialize a vector with an array of integers
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> v(arr, arr+10);
//Print out original vector
cout << "The original list: " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//Replace the number 7 with 11
replace(v.begin(), v.end(), 7, 11);
// Print out vector with 7 replaced,
// s.b. 1 2 3 4 5 6 11 8 9 10
cout << "List after replace " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//Replace 1 2 3 with 13 13 13
replace_if(v.begin(), v.begin()+3, all_true<int>(), 13);
// Print out the remaining vector,
// s.b. 13 13 13 4 5 6 11 8 9 10
cout << "List after replace_if " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
return 0;
}
Output :
The original list:
1 2 3 4 5 6 7 8 9 10
List after replace:
1 2 3 4 5 6 11 8 9 10
List after replace_if:
13 13 13 4 5 6 11 8 9 10
List using replace_copy to cout:
17 17 17 4 5 6 11 8 9 10
List with all elements output as 19s:
19 19 19 19 19 19 19 19 19 19
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
replace, replace_copy, replace_copy_if
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
reverse
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
reverse - Reverse the order of elements in a collection.
SYNOPSIS
#include <algorithm>
template <class BidirectionalIterator>
void reverse (BidirectionalIterator first,
BidirectionalIterator last);
DESCRIPTION
The algorithm reverse reverses the elements in a sequence so that
the last element becomes the new first element, and the first
element becomes the new last. For each non-negative integer i <=
(last - first)/2 , reverse applies swap to all pairs of
iterators first + I, (last - I) - 1.
Because the iterators are assumed to be bidirectional, reverse does
not return anything.
COMPLEXITY
reverse performs exactly (last - first)/2 swaps.
EXAMPLE
//
// reverse.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main()
{
//Initialize a vector with an array of ints
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> v(arr, arr+10);
//Print out elements in original (sorted) order
cout << "Elements before reverse: " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//Reverse the ordering
reverse(v.begin(), v.end());
//Print out the reversed elements
cout << "Elements after reverse: " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl;
return 0;
}
Output :
Elements before reverse:
1 2 3 4 5 6 7 8 9 10
Elements after reverse:
10 9 8 7 6 5 4 3 2 1
A reverse_copy to cout:
1 2 3 4 5 6 7 8 9 10
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
reverse_copy, swap
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
reverse_copy
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
reverse_copy - Reverse the order of elements in a collection while
copying them to a new collecton.
SYNOPSIS
#include <algorithm>
template <class BidirectionalIterator, class OutputIterator>
OutputIterator reverse_copy (BidirectionalIterator first,
BidirectionalIterator last,
OutputIterator result);
DESCRIPTION
The reverse_copy algorithm copies the range [first, last) to the range
[result, result + (last - first)) such that for any non-negative integer i
< (last - first), the following assignment takes place:
*(result + (last - first) -i) = *(first + i)
reverse_copy returns result + (last - first). The ranges [first, last)
and [result, result + (last - first)) must not overlap.
COMPLEXITY
reverse_copy performs exactly (last - first) assignments.
EXAMPLE
//
// reverse.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main ()
{
//
// Initialize a vector with an array of integers.
//
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
vector<int> v(arr+0, arr+10);
//
// Print out elements in original (sorted) order.
//
cout << "Elements before reverse: " << endl << " ";
copy(v.begin(), v.end(), ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//
// Reverse the ordering.
//
reverse(v.begin(), v.end());
//
// Print out the reversed elements.
//
cout << "Elements after reverse: " << endl << " ";
copy(v.begin(), v.end(), ostream_iterator<int,char>(cout," "));
cout << endl << endl;
cout << "A reverse_copy to cout: " << endl << " ";
reverse_copy(v.begin(), v.end(),
ostream_iterator<int,char>(cout, " "));
cout << endl;
return 0;
}
Output :
Elements before reverse:
1 2 3 4 5 6 7 8 9 10
Elements after reverse:
10 9 8 7 6 5 4 3 2 1
A reverse_copy to cout:
1 2 3 4 5 6 7 8 9 10
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
reverse
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
rotate
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
rotate, rotate_copy - Left rotates the order of items in a
collection, placing the first item at the end, second item
first, etc., until the item pointed to by a specified
iterator is the first item in the collection.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator>
void rotate (ForwardIterator first,
ForwardIterator middle,
ForwardIterator last);
template <class ForwardIterator, class OutputIterator>
OutputIterator rotate_copy (ForwardIterator first,
ForwardIterator middle,
ForwardIterator last,
OutputIterator result);
DESCRIPTION
The rotate algorithm takes three iterator arguments, first, which
defines the start of a sequence, last, which defines the end of the
sequence, and middle which defines a point within the sequence.
rotate "swaps" the segment that contains elements from first
through middle-1 with the segment that contains the elements
from middle through last. After rotate has been applied, the
element that was in position middle, is in position first, and
the other elements in that segment are in the same order relative to
each other. Similarly, the element that was in position first is
now in position last-middle +1. An example will illustrate how
rotate works:
Say that we have the sequence:
2 4 6 8 1 3 5
If we call rotate with middle = 5, the two segments are
2 4 6 8 and 1 3 5
After we apply rotate, the new sequence will be:
1 3 5 2 4 6 8
Note that the element that was in the fifth position is now in the
first position, and the element that was in the first position is
in position 4 (last - first + 1, or 8 - 5 +1 =4).
The formal description of this algorithms is: for each non-negative
integer i < (last - first), rotate places the element from the
position first + i into position first + (i + (last -
middle)) % (last - first). [first, middle) and [middle, last)
are valid ranges.
rotate_copy rotates the elements as described above, but instead of
swapping elements within the same sequence, it copies the result
of the rotation to a container specified by result.
rotate_copy copies the range [first, last) to the range [result,
result + (last - first)) such that for each non-negative integer i
< (last - first) the following assignment takes place:
*(result + (i + (last - middle)) % (last -first)) = *(first + i).
The ranges [first, last) and [result, result, + (last - first)) may not
overlap.
COMPLEXITY
For rotate at most last - first swaps are performed.
For rotate_copy last - first assignments are performed.
EXAMPLE
//
// rotate
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main()
{
//Initialize a vector with an array of ints
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> v(arr, arr+10);
//Print out elements in original (sorted) order
cout << "Elements before rotate: " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//Rotate the elements
rotate(v.begin(), v.begin()+4, v.end());
//Print out the rotated elements
cout << "Elements after rotate: " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl;
return 0;
}
Output :
Elements before rotate:
1 2 3 4 5 6 7 8 9 10
Elements after rotate:
5 6 7 8 9 10 1 2 3 4
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
rotate_copy
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
rotate, rotate_copy - Left rotates the order of items in a
collection, placing the first item at the end, second item
first, etc., until the item pointed to by a specified
iterator is the first item in the collection.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator>
void rotate (ForwardIterator first,
ForwardIterator middle,
ForwardIterator last);
template <class ForwardIterator, class OutputIterator>
OutputIterator rotate_copy (ForwardIterator first,
ForwardIterator middle,
ForwardIterator last,
OutputIterator result);
DESCRIPTION
The rotate algorithm takes three iterator arguments, first, which
defines the start of a sequence, last, which defines the end of the
sequence, and middle which defines a point within the sequence.
rotate "swaps" the segment that contains elements from first
through middle-1 with the segment that contains the elements
from middle through last. After rotate has been applied, the
element that was in position middle, is in position first, and
the other elements in that segment are in the same order relative to
each other. Similarly, the element that was in position first is
now in position last-middle +1. An example will illustrate how
rotate works:
Say that we have the sequence:
2 4 6 8 1 3 5
If we call rotate with middle = 5, the two segments are
2 4 6 8 and 1 3 5
After we apply rotate, the new sequence will be:
1 3 5 2 4 6 8
Note that the element that was in the fifth position is now in the
first position, and the element that was in the first position is
in position 4 (last - first + 1, or 8 - 5 +1 =4).
The formal description of this algorithms is: for each non-negative
integer i < (last - first), rotate places the element from the
position first + i into position first + (i + (last -
middle)) % (last - first). [first, middle) and [middle, last)
are valid ranges.
rotate_copy rotates the elements as described above, but instead of
swapping elements within the same sequence, it copies the result
of the rotation to a container specified by result.
rotate_copy copies the range [first, last) to the range [result,
result + (last - first)) such that for each non-negative integer i
< (last - first) the following assignment takes place:
*(result + (i + (last - middle)) % (last -first)) = *(first + i).
The ranges [first, last) and [result, result, + (last - first))
may not overlap.
COMPLEXITY
For rotate at most last - first swaps are performed.
For rotate_copy last - first assignments are performed.
EXAMPLE
//
// rotate
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main()
{
//Initialize a vector with an array of ints
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> v(arr, arr+10);
//Print out elements in original (sorted) order
cout << "Elements before rotate: " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//Rotate the elements
rotate(v.begin(), v.begin()+4, v.end());
//Print out the rotated elements
cout << "Elements after rotate: " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
cout << endl;
return 0;
}
Output :
Elements before rotate:
1 2 3 4 5 6 7 8 9 10
Elements after rotate:
5 6 7 8 9 10 1 2 3 4
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
search
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
search, search_n - Finds a sub-sequence within a sequence of values
that is element-wise equal to the values in an indicated range.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search (ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template <class ForwardIterator1,
class ForwardIterator2,
class BinaryPredicate>
ForwardIterator1 search (ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate binary_pred);
template <class ForwardIterator,
class Size,
class T>
ForwardIterator search_n (ForwardIterator first,
ForwardIterator last,
Size count, const T& value);
template <class ForwardIterator,
class Size,
class T,
class BinaryPredicate>
ForwardIterator search_n (ForwardIterator first,
ForwardIterator last,
Size count, const T& value,
BinaryPredicate pred)
DESCRIPTION
The search and search_n are used for searching for a sub-sequence
within a sequence. The search algorithm searches for a
sub-sequence [first2, last2) within a sequence [first1, last1), and
returns the beginning location of the sub-sequence. If it
does not find the sub-sequence, search returns last1. The first
version of search uses the equality (==) operator as a default, and
the second version allows you to specify a binary predicate to
perform the comparison.
The search_n algorithm searches for the sub-sequence composed of
count occurrences of value within a sequence [first, last), and
returns first if this sub-sequence is found. If it does not find
the sub-sequence, search_n returns last. The first version of
search_n uses the equality (==) operator as a default, and
the second version allows you to specify a binary predicate to
perform the comparison.
COMPLEXITY
search performs at most (last1 - first1)*(last2-first2) applications
of the corresponding predicate.
search_n performs at most (last - first) applications of the
corresponding predicate.
EXAMPLE
//
// search.cpp
//
#include <algorithm>
#include <list>
#include <iostream.h>
int main()
{
// Initialize a list sequence and
// sub-sequence with characters
char seq[40] = "Here's a string with a substring in it";
char subseq[10] = "substring";
list<char> sequence(seq, seq+39);
list<char> subseqnc(subseq, subseq+9);
//Print out the original sequence
cout << endl << "The sub-sequence, " << subseq
<< ", was found at the ";
cout << endl << "location identified by a '*'"
<< endl << " ";
// Create an iterator to identify the location of
// sub-sequence within sequence
list<char>::iterator place;
//Do search
place = search(sequence.begin(), sequence.end(),
subseqnc.begin(), subseqnc.end());
//Identify result by marking first character with a '*'
*place = '*';
//Output sequence to display result
for(list<char>::iterator i = sequence.begin();
i != sequence.end(); i++)
cout << *i;
cout << endl;
return 0;
}
Output :
The sub-sequence, substring, was found at the
location identified by a '*'
Here's a string with a *substring in it
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
list<char, allocator<char> >
instead of :
list<char>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
search_n
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
search, search_n - Finds a sub-sequence within a sequence of values
that is element-wise equal to the values in an indicated range.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search (ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template <class ForwardIterator1,
class ForwardIterator2,
class BinaryPredicate>
ForwardIterator1 search (ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate binary_pred);
template <class ForwardIterator,
class Size,
class T>
ForwardIterator search_n (ForwardIterator first,
ForwardIterator last,
Size count, const T& value);
template <class ForwardIterator,
class Size,
class T,
class BinaryPredicate>
ForwardIterator search_n (ForwardIterator first,
ForwardIterator last,
Size count, const T& value,
BinaryPredicate pred)
DESCRIPTION
The search and search_n are used for searching for a sub-sequence
within a sequence. The search algorithm searches for a
sub-sequence [first2, last2) within a sequence [first1, last1), and
returns the beginning location of the sub-sequence. If it
does not find the sub-sequence, search returns last1. The first
version of search uses the equality (==) operator as a default, and
the second version allows you to specify a binary predicate to
perform the comparison.
The search_n algorithm searches for the sub-sequence composed of
count occurrences of value within a sequence [first, last), and
returns first if this sub-sequence is found. If it does not find
the sub-sequence, search_n returns last. The first version of
search_n uses the equality (==) operator as a default, and
the second version allows you to specify a binary predicate to
perform the comparison.
COMPLEXITY
search performs at most (last1 - first1)*(last2-first2) applications of
the corresponding predicate.
search_n performs at most (last - first) applications of the corresponding
predicate.
EXAMPLE
//
// search.cpp
//
#include <algorithm>
#include <list>
#include <iostream.h>
int main()
{
// Initialize a list sequence and
// sub-sequence with characters
char seq[40] = "Here's a string with a substring in it";
char subseq[10] = "substring";
list<char> sequence(seq, seq+39);
list<char> subseqnc(subseq, subseq+9);
//Print out the original sequence
cout << endl << "The sub-sequence, " << subseq
<< ", was found at the ";
cout << endl << "location identified by a '*'"
<< endl << " ";
// Create an iterator to identify the location of
// sub-sequence within sequence
list<char>::iterator place;
//Do search
place = search(sequence.begin(), sequence.end(),
subseqnc.begin(), subseqnc.end());
//Identify result by marking first character with a '*'
*place = '*';
//Output sequence to display result
for(list<char>::iterator i = sequence.begin();
i != sequence.end(); i++)
cout << *i;
cout << endl;
return 0;
}
Output :
The sub-sequence, substring, was found at the
location identified by a '*'
Here's a string with a *substring in it
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
list<char, allocator<char> >
instead of :
list<char>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
set_difference
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
set_difference - Basic set operation for sorted sequences.
SYNOPSIS
#include <algorithm>
template <class InputIterator1, class InputIterator2,
class OutputIterator>
OutputIterator
set_difference (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result);
template <class InputIterator1, class InputIterator2,
class OutputIterator, class Compare>
OutputIterator
set_difference (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result, Compare comp);
DESCRIPTION
The set_difference algorithm constructs a sorted difference that
includes copies of the elements that are present in the range
[first1, last1) but are not present in the range [first2,
last2). It returns the end of the constructed range.
As an example, assume we have the following two sets:
1 2 3 4 5
and
3 4 5 6 7
The result of applying set_difference is the set:
1 2
The result of set_difference is undefined if the result range
overlaps with either of the original ranges.
set_difference assumes that the ranges are sorted using the default
comparison operator less than (<), unless an alternative
comparison operator (comp) is provided.
Use the set_symetric_difference algorithm to return a result that
contains all elements that are not in common between the two
sets.
COMPLEXITY
At most ((last1 - first1) + (last2 - first2)) * 2 -1 comparisons
are performed.
EXAMPLE
//
// set_diff.cpp
//
#include <algorithm>
#include <set>
#include <iostream.h>
int main()
{
//Initialize some sets
int a1[10] = {1,2,3,4,5,6,7,8,9,10};
int a2[6] = {2,4,6,8,10,12};
set<int, less<int> > all(a1, a1+10), even(a2, a2+6),
odd;
//Create an insert_iterator for odd
insert_iterator<set<int, less<int> > >
odd_ins(odd, odd.begin());
//Demonstrate set_difference
cout << "The result of:" << endl << "{";
copy(all.begin(),all.end(),
ostream_iterator<int,char>(cout," "));
cout << "} - {";
copy(even.begin(),even.end(),
ostream_iterator<int,char>(cout," "));
cout << "} =" << endl << "{";
set_difference(all.begin(), all.end(),
even.begin(), even.end(), odd_ins);
copy(odd.begin(),odd.end(),
ostream_iterator<int,char>(cout," "));
cout << "}" << endl << endl;
return 0;
}
Output :
The result of:
{1 2 3 4 5 6 7 8 9 10 } - {2 4 6 8 10 12 } =
{1 3 5 7 9 }
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Compare template argument and the
Allocator template argument. For instance, you will need
to write :
set<int, less<int> allocator<int> >
instead of :
set<int>
SEE ALSO
includes, set, set_union, set_intersection, set_symmetric_difference
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
set_intersection
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
set_intersection - Basic set operation for sorted sequences.
SYNOPSIS
#include <algorithm>
template <class InputIterator1, class InputIterator2,
class OutputIterator>
OutputIterator
set_intersection (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator last2,
OutputIterator result);
template <class InputIterator1, class InputIterator2,
class OutputIterator, class Compare>
OutputIterator
set_intersection (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result, Compare comp);
DESCRIPTION
The set_intersection algorithm constructs a sorted intersection of
elements from the two ranges. It returns the end of the constructed
range. When it finds an element present in both ranges,
set_intersection always copies the element from the first range into
result. This means that the result of set_intersection is
guaranteed to be stable. The result of set_intersection is
undefined if the result range overlaps with either of the
original ranges.
set_intersection assumes that the ranges are sorted using the
default comparison operator less than (<), unless an
alternative comparison operator (comp) is provided.
COMPLEXITY
At most ((last1 - first1) + (last2 - first2)) * 2 -1 comparisons are per-
formed.
EXAMPLE
//
// set_intr.cpp
//
#include <algorithm>
#include <set>
#include <iostream.h>
int main()
{
//Initialize some sets
int a1[10] = {1,3,5,7,9,11};
int a3[4] = {3,5,7,8};
set<int, less<int> > odd(a1, a1+6),
result, small(a3,a3+4);
//Create an insert_iterator for result
insert_iterator<set<int, less<int> > >
res_ins(result, result.begin());
//Demonstrate set_intersection
cout << "The result of:" << endl << "{";
copy(small.begin(),small.end(),
ostream_iterator<int,char>(cout," "));
cout << "} intersection {";
copy(odd.begin(),odd.end(),
ostream_iterator<int,char>(cout," "));
cout << "} =" << endl << "{";
set_intersection(small.begin(), small.end(),
odd.begin(), odd.end(), res_ins);
copy(result.begin(),result.end(),
ostream_iterator<int,char>(cout," "));
cout << "}" << endl << endl;
return 0;
}
Output :
The result of:
{3 5 7 8 } intersection {1 3 5 7 9 11 } =
{3 5 7 }
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Compare template argument and the
Allocator template argument. For instance, you will need
to write :
set<int, less<int> allocator<int> >
instead of :
set<int>
SEE ALSO
includes, set, set_union, set_difference, set_symmetric_difference
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
set_symmetric_difference
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
set_symmetric_difference - Basic set operation for sorted sequences.
SYNOPSIS
#include <algorithm>
template <class InputIterator1, class InputIterator2,
class OutputIterator>
OutputIterator
set_symmetric_difference (InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result);
template <class InputIterator1, class InputIterator2,
class OutputIterator, class Compare>
OutputIterator
set_symmetric_difference (InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result, Compare comp);
DESCRIPTION
set_symmetric_difference constructs a sorted symmetric difference of
the elements from the two ranges. This means that the
constructed range includes copies of the elements that are present
in the range [first1, last1) but not present in the range [first2,
last2)and copies of the elements that are present in
the range [first2, last2) but not in the range [first1, last1).
It returns the end of the constructed range.
For example, suppose we have two sets:
1 2 3 4 5
and
3 4 5 6 7
The set_symmetric_difference of these two sets is:
1 2 6 7
The result of set_symmetric_difference is undefined if the result
range overlaps with either of the original ranges.
set_symmetric_difference assumes that the ranges are sorted using
the default comparison operator less than (<), unless an
alternative comparison operator (comp) is provided.
Use the set_symmetric_difference algorithm to return a result that
includes elements that are present in the first set and not
in the second.
COMPLEXITY
At most ((last1 - first1) + (last2 - first2)) * 2 -1 comparisons
are performed.
EXAMPLE
//
// set_s_di.cpp
//
#include<algorithm>
#include<set>
#include <istream.h>
int main()
{
//Initialize some sets
int a1[] = {1,3,5,7,9,11};
int a3[] = {3,5,7,8};
set<int, less<int> > odd(a1,a1+6), result,
small(a3,a3+4);
//Create an insert_iterator for result
insert_iterator<set<int, less<int> > >
res_ins(result, result.begin());
//Demonstrate set_symmetric_difference
cout << "The symmetric difference of:" << endl << "{";
copy(small.begin(),small.end(),
ostream_iterator<int,char>(cout," "));
cout << "} with {";
copy(odd.begin(),odd.end(),
ostream_iterator<int,char>(cout," "));
cout << "} =" << endl << "{";
set_symmetric_difference(small.begin(), small.end(),
odd.begin(), odd.end(), res_ins);
copy(result.begin(),result.end(),
ostream_iterator<int,char>(cout," "));
cout << "}" << endl << endl;
return 0;
}
Output :
The symmetric difference of:
{3 5 7 8 } with {1 3 5 7 9 11 } =
{1 8 9 11 }
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Compare template argument and the
Allocator template argument. For instance, you will need
to write :
set<int, less<int>, allocator<int> >
instead of :
set<int>
SEE ALSO
includes, set, set_union, set_intersection, set_difference
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
set_union
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
set_union - Basic set operation for sorted sequences.
SYNOPSIS
#include <algorithm>
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator
set_union (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result);
template <class InputIterator1, class InputIterator2,
class OutputIterator, class Compare>
OutputIterator
set_union (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result, Compare comp);
DESCRIPTION
The set_union algorithm constructs a sorted union of the elements
from the two ranges. It returns the end of the constructed range.
set_union is stable, that is, if an element is present in both
ranges, the one from the first range is copied. The result of
set_union is undefined if the result range overlaps with either
of the original ranges. Note that set_union does not merge the
two sorted sequences. If an element is present in both
sequences, only the element from the first sequence is copied to
result. (Use the merge algorithm to create an ordered merge of two
sorted sequences that contains all the elements from both
sequences.)
set_union assumes that the sequences are sorted using the default
comparison operator less than (<), unless an alternative
comparison operator (comp) is provided.
COMPLEXITY
At most ((last1 - first1) + (last2 - first2)) * 2 -1 comparisons
are performed.
EXAMPLE
//
// set_unin.cpp
//
#include <algorithm>
#include <set>
#include <iostream.h>
int main()
{
//Initialize some sets
int a2[6] = {2,4,6,8,10,12};
int a3[4] = {3,5,7,8};
set<int, less<int> > even(a2, a2+6),
result, small(a3,a3+4);
//Create an insert_iterator for result
insert_iterator<set<int, less<int> > >
res_ins(result, result.begin());
//Demonstrate set_union
cout << "The result of:" << endl << "{";
copy(small.begin(),small.end(),
ostream_iterator<int,char>(cout," "));
cout << "} union {";
copy(even.begin(),even.end(),
ostream_iterator<int,char>(cout," "));
cout << "} =" << endl << "{";
set_union(small.begin(), small.end(),
even.begin(), even.end(), res_ins);
copy(result.begin(),result.end(),
ostream_iterator<int,char>(cout," "));
cout << "}" << endl << endl;
return 0;
}
Output :
The result of:
{3 5 7 8 } union {2 4 6 8 10 12 } =
{2 3 4 5 6 7 8 10 12 }
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Compare template argument and the
Allocator template argument. For instance, you will need
to write :
set<int, less<int>, allocator<int> >
instead of :
set<int>
SEE ALSO
includes, set, set_intersection, set_difference, set_symmetric_difference
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
sort
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
sort - Templated algorithm for sorting collections of entities.
SYNOPSIS
#include <algorithm>
template <class RandomAccessIterator>
void sort (RandomAccessIterator first,
RandomAccessIterator last);
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first,
RandomAccessIterator last, Compare comp);
DESCRIPTION
The sort algorithm sorts the elements in the range [first, last)
using either the less than (<) operator or the comparison operator
comp. If the worst case behavior is important stable_sort or
partial_sort should be used.
COMPLEXITY
sort performs approximately NlogN, where N equals last - first, comparis-
ons on the average.
EXAMPLE
//
// sort.cpp
//
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream.h>
struct associate
{
int num;
char chr;
associate(int n, char c) : num(n), chr(c){};
associate() : num(0), chr(' '){};
};
bool operator<(const associate &x, const associate &y)
{
return x.num < y.num;
}
ostream& operator<<(ostream &s, const associate &x)
{
return s << "<" << x.num << ";" << x.chr << ">";
}
int main ()
{
vector<associate>::iterator i, j, k;
associate arr[20] =
{associate(-4, ' '), associate(16, ' '),
associate(17, ' '), associate(-3, 's'),
associate(14, ' '), associate(-6, ' '),
associate(-1, ' '), associate(-3, 't'),
associate(23, ' '), associate(-3, 'a'),
associate(-2, ' '), associate(-7, ' '),
associate(-3, 'b'), associate(-8, ' '),
associate(11, ' '), associate(-3, 'l'),
associate(15, ' '), associate(-5, ' '),
associate(-3, 'e'), associate(15, ' ')};
// Set up vectors
vector<associate> v(arr, arr+20), v1((size_t)20),
v2((size_t)20);
// Copy original vector to vectors #1 and #2
copy(v.begin(), v.end(), v1.begin());
copy(v.begin(), v.end(), v2.begin());
// Sort vector #1
sort(v1.begin(), v1.end());
// Stable sort vector #2
stable_sort(v2.begin(), v2.end());
// Display the results
cout << "Original sort stable_sort" << endl;
for(i = v.begin(), j = v1.begin(), k = v2.begin();
i != v.end(); i++, j++, k++)
cout << *i << " " << *j << " " << *k << endl;
return 0;
}
Output :
Original sort stable_sort
<-4; > <-8; > <-8; >
<16; > <-7; > <-7; >
<17; > <-6; > <-6; >
<-3;s> <-5; > <-5; >
<14; > <-4; > <-4; >
<-6; > <-3;e> <-3;s>
<-1; > <-3;s> <-3;t>
<-3;t> <-3;l> <-3;a>
<23; > <-3;t> <-3;b>
<-3;a> <-3;b> <-3;l>
<-2; > <-3;a> <-3;e>
<-7; > <-2; > <-2; >
<-3;b> <-1; > <-1; >
<-8; > <11; > <11; >
<11; > <14; > <14; >
<-3;l> <15; > <15; >
<15; > <15; > <15; >
<-5; > <16; > <16; >
<-3;e> <17; > <17; >
<15; > <23; > <23; >
WARNING
If your compiler does not support default template parameters, then you
need to always supply the Allocator template argument. For instance, you
will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
stable_sort, partial_sort, partial_sort_copy
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
sort_heap
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
sort_heap - Converts a heap into a sorted collection.
SYNOPSIS
#include <algorithm>
template <class RandomAccessIterator>
void
sort_heap(RandomAccessIterator first,
RandomAccessIterator last);
template <class RandomAccessIterator, class Compare>
void
sort_heap(RandomAccessIterator first,
RandomAccessIterator last, Compare comp);
DESCRIPTION
A heap is a particular organization of elements in a range between
two random access iterators [a, b). Its two key properties are:
1. *a is the largest element in the range.
2. *a may be removed by pop_heap(), or a new element added by push_heap(),
in O(logN) time.
These properties make heaps useful as priority queues.
The sort_heap algorithm converts a heap into a sorted collection
over the range [first, last) using either the default
operator (<) or the comparison function supplied with the
algorithm. Note that sort_heap is not stable, i.e., the
elements may not be in the same relative order after sort_heap is
applied.
COMPLEXITY
sort_heap performs at most NlogN comparisons where N is equal to
last - first.
EXAMPLE
//
// heap_ops.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main(void)
{
int d1[4] = {1,2,3,4};
int d2[4] = {1,3,2,4};
// Set up two vectors
vector<int> v1(d1,d1 + 4), v2(d2,d2 + 4);
// Make heaps
make_heap(v1.begin(),v1.end());
make_heap(v2.begin(),v2.end(),less<int>());
// v1 = (4,x,y,z) and v2 = (4,x,y,z)
// Note that x, y and z represent the remaining
// values in the container (other than 4).
// The definition of the heap and heap operations
// does not require any particular ordering
// of these values.
// Copy both vectors to cout
ostream_iterator<int,char> out(cout," ");
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
// Now let's pop
pop_heap(v1.begin(),v1.end());
pop_heap(v2.begin(),v2.end(),less<int>());
// v1 = (3,x,y,4) and v2 = (3,x,y,4)
// Copy both vectors to cout
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
// And push
push_heap(v1.begin(),v1.end());
push_heap(v2.begin(),v2.end(),less<int>());
// v1 = (4,x,y,z) and v2 = (4,x,y,z)
// Copy both vectors to cout
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
// Now sort those heaps
sort_heap(v1.begin(),v1.end());
sort_heap(v2.begin(),v2.end(),less<int>());
// v1 = v2 = (1,2,3,4)
// Copy both vectors to cout
copy(v1.begin(),v1.end(),out);
cout << endl;
copy(v2.begin(),v2.end(),out);
cout << endl;
return 0;
}
Output :
4 2 3 1
4 3 2 1
3 2 1 4
3 1 2 4
4 3 1 2
4 3 2 1
1 2 3 4
1 2 3 4
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
make_heap, pop_heap, push_heap
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
stable_partition
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
stable_partition - Places all of the entities that satisfy the
given predicate before all of the entities that do not, while
maintaining the relative order of elements in each group.
SYNOPSIS
#include <algorithm>
template <class BidirectionalIterator, class Predicate>
BidirectionalIterator
stable_partition (BidirectionalIterator first,
BidirectionalIterator last,
Predicate pred);
DESCRIPTION
The stable_partition algorithm places all the elements in the range
[first, last) that satisfy pred before all the elements that do not
satisfy it. It returns an iterator i that is one past the end of
the group of elements that satisfy pred. In other words
stable_partition returns i such that for any iterator j in the
range [first, i), pred(*j) == true, and for any iterator k in
the range [i, last), pred(*j) == false. The relative order of
the elements in both groups is preserved.
The partition algorithm can be used when it is not necessary to
maintain the relative order of elements within the groups
that do and do not match the predicate.
COMPLEXITY
The stable_partition algorithm does at most (last - first) *
log(last - first) swaps. and applies the predicate exactly last
- first times.
EXAMPLE
//
// prtition.cpp
//
#include <functional>
#include <deque>
#include <algorithm>
#include <iostream.h>
//Create a new predicate from unary_function
template<class Arg>
class is_even : public unary_function<Arg, bool>
{
public:
bool operator()(const Arg& arg1)
{
return (arg1 % 2) == 0;
}
};
int main()
{
//Initialize a deque with an array of ints
int init[10] = {1,2,3,4,5,6,7,8,9,10};
deque<int> d(init, init+10);
//Print out the original values
cout << "Unpartitioned values: " << endl << " ";
copy(d.begin(),d.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
//Partition the deque according to even/oddness
stable_partition(d.begin(), d.end(), is_even<int>());
//Output result of partition
cout << "Partitioned values: " << endl << " ";
copy(d.begin(),d.end(),ostream_iterator<int,char>(cout," "));
return 0;
}
Output :
Unpartitioned values: 1 2 3 4 5 6 7 8 9 10
Partitioned values: 10 2 8 4 6 5 7 3 9 1
Stable partitioned values: 2 4 6 8 10 1 3 5 7 9
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
deque<int, allocator<int> >
instead of :
deque<int>
SEE ALSO
partition
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
stable_sort
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
stable_sort - Templated algorithm for sorting collections of
entities.
SYNOPSIS
#include <algorithm>
template <class RandomAccessIterator>
void stable_sort (RandomAccessIterator first,
RandomAccessIterator last);
template <class RandomAccessIterator, class Compare>
void stable_sort (RandomAccessIterator first,
RandomAccessIterator last,
Compare comp);
DESCRIPTION
The stable_sort algorithm sorts the elements in the range [first,
last). The first version of the algorithm uses less than (<) as the
comparison operator for the sort. The second version uses the
comparison function comp.
The stable_sort algorithm is considered stable because the relative
order of the equal elements is preserved.
COMPLEXITY
stable_sort does at most N(logN) **2, where N equals last -first,
comparisons; if enough extra memory is available, it is NlogN.
EXAMPLE
//
// sort.cpp
//
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream.h>
struct associate
{
int num;
char chr;
associate(int n, char c) : num(n), chr(c){};
associate() : num(0), chr(' '){};
};
bool operator<(const associate &x, const associate &y)
{
return x.num < y.num;
}
ostream& operator<<(ostream &s, const associate &x)
{
return s << "<" << x.num << ";" << x.chr << ">";
}
int main ()
{
vector<associate>::iterator i, j, k;
associate arr[20] =
{associate(-4, ' '), associate(16, ' '),
associate(17, ' '), associate(-3, 's'),
associate(14, ' '), associate(-6, ' '),
associate(-1, ' '), associate(-3, 't'),
associate(23, ' '), associate(-3, 'a'),
associate(-2, ' '), associate(-7, ' '),
associate(-3, 'b'), associate(-8, ' '),
associate(11, ' '), associate(-3, 'l'),
associate(15, ' '), associate(-5, ' '),
associate(-3, 'e'), associate(15, ' ')};
// Set up vectors
vector<associate> v(arr, arr+20), v1((size_t)20),
v2((size_t)20);
// Copy original vector to vectors #1 and #2
copy(v.begin(), v.end(), v1.begin());
copy(v.begin(), v.end(), v2.begin());
// Sort vector #1
sort(v1.begin(), v1.end());
// Stable sort vector #2
stable_sort(v2.begin(), v2.end());
// Display the results
cout << "Original sort stable_sort" << endl;
for(i = v.begin(), j = v1.begin(), k = v2.begin();
i != v.end(); i++, j++, k++)
cout << *i << " " << *j << " " << *k << endl;
return 0;
}
Output :
Original sort stable_sort
<-4; > <-8; > <-8; >
<16; > <-7; > <-7; >
<17; > <-6; > <-6; >
<-3;s> <-5; > <-5; >
<14; > <-4; > <-4; >
<-6; > <-3;e> <-3;s>
<-1; > <-3;s> <-3;t>
<-3;t> <-3;l> <-3;a>
<23; > <-3;t> <-3;b>
<-3;a> <-3;b> <-3;l>
<-2; > <-3;a> <-3;e>
<-7; > <-2; > <-2; >
<-3;b> <-1; > <-1; >
<-8; > <11; > <11; >
<11; > <14; > <14; >
<-3;l> <15; > <15; >
<15; > <15; > <15; >
<-5; > <16; > <16; >
<-3;e> <17; > <17; >
<15; > <23; > <23; >
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator>
instead of :
vector<int>
SEE ALSO
sort, partial_sort, partial_sort_copy
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
swap
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
swap - Exchange values.
SYNOPSIS
#include <algorithm>
template <class T>
void swap (T& a, T& b);
DESCRIPTION
The swap algorithm exchanges the values of a and b. The effect is:
T tmp = a
a = b
b = tmp
SEE ALSO
iter_swap, swap_ranges
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
swap_ranges
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
swap_ranges - Exchange a range of values in one location with those in
another
SYNOPSIS
#include <algorithm>
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator2 swap_ranges (ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2);
DESCRIPTION
The swap_ranges algorithm exchanges corresponding values in two
ranges, in the following manner:
For each non-negative integer n < (last - first) the function
exchanges *(first1 + n) with *(first2 + n)). After completing
all exchanges, swap_ranges returns an iterator that points to the
end of the second container, i.e., first2 + (last1
-first1). The result of swap_ranges is undefined if the
two ranges [first, last) and [first2, first2 + (last1 -
first1)) overlap.
EXAMPLE
//
// swap.cpp
//
#include <vector>
#include <algorithm>
int main()
{
int d1[] = {6, 7, 8, 9, 10, 1, 2, 3, 4, 5};
// Set up a vector
vector<int> v(d1,d1 + 10);
// Output original vector
cout << "For the vector: ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
// Swap the first five elements with the last five elements
swap_ranges(v.begin(),v.begin()+5, v.begin()+5);
// Output result
cout << endl << endl
<< "Swapping the first five elements "
<< "with the last five gives: "
<< endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
return 0;
}
Output :
For the vector: 6 7 8 9 10 1 2 3 4 5
Swapping the first five elements with the last five gives:
1 2 3 4 5 6 7 8 9 10
Swapping the first and last elements gives:
10 2 3 4 5 6 7 8 9 1
WARNING
If your compiler does not support default template parameters, you
need to always supply the Allocator template argument. For instance,
you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
iter_swap, swap
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
transform
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
transform - Applies an operation to a range of values in a
collection and stores the result.
SYNOPSIS
#include <algorithm>
template <class InputIterator,
class OutputIterator,
class UnaryOperation>
OutputIterator transform (InputIterator first,
InputIterator last,
OutputIterator result,
UnaryOperation op);
template <class InputIterator1,
class InputIterator2,
class OutputIterator,
class BinaryOperation>
OutputIterator transform (InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
OutputIterator result,
BinaryOperation binary_op);
DESCRIPTION
The transform algorithm has two forms. The first form applies unary
operation op to each element of the range [first, last), and sends
the result to the output iterator result. For example, this version
of transform, could be used to square each element in a vector. If
the output iterator (result) is the same as the input iterator used
to traverse the range, transform, performs its transformation in
place.
The second form of transform applies a binary operation, binary_op,
to corresponding elements in the range [first1, last1) and the
range that begins at first2, and sends the result to result.
For example, transform can be used to add corresponding elements in
two sequences, and store the set of sums in a third. The
algorithm assumes, but does not check, that the second sequence has
at least as many elements as the first sequence. Note that the
output iterator result can be a third sequence, or either of
the two input sequences.
Formally, transform assigns through every iterator i in the range
[result, result + (last1 - first1)) a new corresponding value equal
to:
op(*(first1 + (i - result))
or
binary_op(*(first1 + (i - result), *(first2 + (i - result)))
transform returns result + (last1 - first1). op and binary_op
must not have any side effects. result may be equal to first
in case of unary transform, or to first1 or first2 in case of
binary transform.
COMPLEXITY
Exactly last1 - first1 applications of op or binary_op are
performed.
EXAMPLE
//
// trnsform.cpp
//
#include <functional>
#include <deque>
#include <algorithm>
#include <iostream.h>
#include <iomanip.h>
int main()
{
//Initialize a deque with an array of ints
int arr1[5] = {99, 264, 126, 330, 132};
int arr2[5] = {280, 105, 220, 84, 210};
deque<int> d1(arr1, arr1+5), d2(arr2, arr2+5);
//Print the original values
cout << "The following pairs of numbers: "
<< endl << " ";
deque<int>::iterator i1;
for(i1 = d1.begin(); i1 != d1.end(); i1++)
cout << setw(6) << *i1 << " ";
cout << endl << " ";
for(i1 = d2.begin(); i1 != d2.end(); i1++)
cout << setw(6) << *i1 << " ";
// Transform the numbers in the deque to their
// factorials and store in the vector
transform(d1.begin(), d1.end(), d2.begin(),
d1.begin(), multiplies<int>());
//Display the results
cout << endl << endl;
cout << "Have the products: " << endl << " ";
for(i1 = d1.begin(); i1 != d1.end(); i1++)
cout << setw(6) << *i1 << " ";
return 0;
}
Output :
The following pairs of numbers:
99 264 126 330 132
280 105 220 84 210
Have the products:
27720 27720 27720 27720 27720
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
deque<int, allocator<int> >
instead of:
deque<int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
uninitialized_copy
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
uninitialized_copy - An algorithms that uses construct to copy values from
one range to another location.
SYNOPSIS
#include <memory>
template <class InputIterator, class ForwardIterator>
ForwardIterator uninitialized_copy (InputIterator first,
InputIterator last,
ForwardIterator result);
DESCRIPTION
uninitialized_copy copies all items in the range [first, last) into
the location beginning at result using the construct algorithm.
SEE ALSO
construct
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
uninitialized_fill
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
uninitialized_fill - Algorithm that uses the construct algorithm
for setting values in a collection.
SYNOPSIS
#include <memory>
template <class ForwardIterator, class T>
void uninitialized_fill(ForwardIterator first,
ForwardIterator last,
const T& x);
DESCRIPTION
uninitialized_fill initializes all of the items in the range [first,
last) to the value x, using the construct algorithm.
SEE ALSO
construct, uninitialized_fill_n
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
uninitialized_fill_n
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
uninitialized_fill_n - Algorithm that uses the construct algorithm for
setting values in a collection.
SYNOPSIS
#include <memory>
template <class ForwardIterator,
class Size, class T>
void uninitialized_fill_n (ForwardIterator first,
Size n, const T& x);
DESCRIPTION
unitialized_fill_n starts at the iterator first and initializes the
first n items to the value x, using the construct algorithm.
SEE ALSO
construct, uninitialized_fill
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
unique
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
unique, unique_copy - Removes consecutive duplicates from a range
of values and places the resulting unique values into the
result.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator>
ForwardIterator unique (ForwardIterator first,
ForwardIterator last);
template <class ForwardIterator, class BinaryPredicate>
ForwardIterator unique (ForwardIterator first,
ForwardIterator last,
BinaryPredicate binary_pred);
template <class InputIterator, class OutputIterator>
OutputIterator unique_copy (InputIterator first,
InputIterator last,
OutputIterator result);
template <class InputIterator,
class OutputIterator,
class BinaryPredicate>
OutputIterator unique_copy (InputIterator first,
InputIterator last,
OutputIterator result,
BinaryPredicate binary_pred);
DESCRIPTION
The unique algorithm moves through a sequence and eliminates all but
the first element from every consecutive group of equal
elements. There are two versions of the algorithm, one tests
for equality, and the other tests whether a binary predicate applied
to adjacent elements is true. An element is unique if it does
not meet the corresponding condition listed here:
*i == *(i - 1)
or
binary_pred(*i, *(i - 1)) == true.
If an element is unique, it is copied to the front of the sequence,
overwriting the existing elements. Once all unique elements have
been identified. The remainder of the sequence is left
unchanged, and unique returns the end of the resulting range.
The unique_copy algorithm copies the first element from every
consecutive group of equal elements, to an OutputIterator. The
unique_copy algorithm, also has two versions--one that tests for
equality and a second that tests adjacent elements against a binary
predicate.
unique_copy returns the end of the resulting range.
COMPLEXITY
Exactly (last - first) - 1 applications of the corresponding predicate are
performed.
EXAMPLE
//
// unique.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main()
{
//Initialize two vectors
int a1[20] = {4, 5, 5, 9, -1, -1, -1, 3, 7, 5,
5, 5, 6, 7, 7, 7, 4, 2, 1, 1};
vector<int> v(a1, a1+20), result;
//Create an insert_iterator for results
insert_iterator<vector<int> > ins(result,
result.begin());
//Demonstrate includes
cout << "The vector: " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
//Find the unique elements
unique_copy(v.begin(), v.end(), ins);
//Display the results
cout << endl << endl
<< "Has the following unique elements:"
<< endl << " ";
copy(result.begin(),result.end(),
ostream_iterator<int,char>(cout," "));
return 0;
}
Output :
The vector:
4 5 5 9 -1 -1 -1 3 7 5 5 5 6 7 7 7 4 2 1 1
Has the following unique elements:
4 5 9 -1 3 7 5 6 7 4 2 1
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of:
vector<int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
unique_copy
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
unique, unique_copy - Removes consecutive duplicates from a range
of values and places the resulting unique values into the
result.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator>
ForwardIterator unique (ForwardIterator first,
ForwardIterator last);
template <class ForwardIterator, class BinaryPredicate>
ForwardIterator unique (ForwardIterator first,
ForwardIterator last,
BinaryPredicate binary_pred);
template <class InputIterator, class OutputIterator>
OutputIterator unique_copy (InputIterator first,
InputIterator last,
OutputIterator result);
template <class InputIterator,
class OutputIterator,
class BinaryPredicate>
OutputIterator unique_copy (InputIterator first,
InputIterator last,
OutputIterator result,
BinaryPredicate binary_pred);
DESCRIPTION
The unique algorithm moves through a sequence and eliminates all but
the first element from every consecutive group of equal
elements. There are two versions of the algorithm, one tests
for equality, and the other tests whether a binary predicate applied
to adjacent elements is true. An element is unique if it does
not meet the corresponding condition listed here:
*i == *(i - 1)
or
binary_pred(*i, *(i - 1)) == true.
If an element is unique, it is copied to the front of the sequence,
overwriting the existing elements. Once all unique elements have
been identified. The remainder of the sequence is left
unchanged, and unique returns the end of the resulting range.
The unique_copy algorithm copies the first element from every
consecutive group of equal elements, to an OutputIterator. The
unique_copy algorithm, also has two versions--one that tests for
equality and a second that tests adjacent elements against a binary
predicate.
unique_copy returns the end of the resulting range.
COMPLEXITY
Exactly (last - first) - 1 applications of the corresponding
predicate are performed.
EXAMPLE
//
// unique.cpp
//
#include <algorithm>
#include <vector>
#include <iostream.h>
int main()
{
//Initialize two vectors
int a1[20] = {4, 5, 5, 9, -1, -1, -1, 3, 7, 5,
5, 5, 6, 7, 7, 7, 4, 2, 1, 1};
vector<int> v(a1, a1+20), result;
//Create an insert_iterator for results
insert_iterator<vector<int> > ins(result,
result.begin());
//Demonstrate includes
cout << "The vector: " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
//Find the unique elements
unique_copy(v.begin(), v.end(), ins);
//Display the results
cout << endl << endl
<< "Has the following unique elements:"
<< endl << " ";
copy(result.begin(),result.end(),
ostream_iterator<int,char>(cout," "));
return 0;
}
Output :
The vector:
4 5 5 9 -1 -1 -1 3 7 5 5 5 6 7 7 7 4 2 1 1
Has the following unique elements:
4 5 9 -1 3 7 5 6 7 4 2 1
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of:
vector<int>
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
upper_bound
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
upper_bound - Determines the last valid position for a value in a
sorted container.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator, class T>
ForwardIterator
upper_bound(ForwardIterator first, ForwardIterator last,
const T& value);
template <class ForwardIterator, class T, class Compare>
ForwardIterator
upper_bound(ForwardIterator first, ForwardIterator last,
const T& value, Compare comp);
DESCRIPTION
The upper_bound algorithm is part of a set of binary search
algorithms. All of these algorithms perform binary searches on
ordered containers. Each algorithm has two versions. The first
version uses the less than operator (operator<) to perform the
comparison, and assumes that the sequence has been sorted using that
operator. The second version allows you to include a function
object of type Compare, and assumes that Compare is the function
used to sort the sequence. The function object must be a binary
predicate.
The upper_bound algorithm finds the last position in a container
that value can occupy without violating the container's ordering.
upper_bound's return value is the iterator for the first element in
the container that is greater than value, or, when the comparison
operator is used, the first element that does not satisfy the
comparison function. Because the algorithm is restricted to using
the less than operator or the user-defined function to perform
the search, upper_bound returns an iterator i in the range
[first, last) such that for any iterator j in the range
[first, i) the appropriate version of the following conditions
holds:
!(value < *j)
or
comp(value, *j) == false
COMPLEXITY
upper_bound performs at most log(last - first) + 1 comparisons.
EXAMPLE
//
// ul_bound.cpp
//
#include <vector>
#include <algorithm>
#include <iostream.h>
int main()
{
typedef vector<int>::iterator iterator;
int d1[11] = {0,1,2,2,3,4,2,2,2,6,7};
// Set up a vector
vector<int> v1(d1,d1 + 11);
// Try lower_bound variants
iterator it1 = lower_bound(v1.begin(),v1.end(),3);
// it1 = v1.begin() + 4
iterator it2 =
lower_bound(v1.begin(),v1.end(),2,less<int>());
// it2 = v1.begin() + 4
// Try upper_bound variants
iterator it3 = upper_bound(v1.begin(),v1.end(),3);
// it3 = vector + 5
iterator it4 =
upper_bound(v1.begin(),v1.end(),2,less<int>());
// it4 = v1.begin() + 5
cout << endl << endl
<< "The upper and lower bounds of 3: ( "
<< *it1 << " , " << *it3 << " ]" << endl;
cout << endl << endl
<< "The upper and lower bounds of 2: ( "
<< *it2 << " , " << *it4 << " ]" << endl;
return 0;
}
Output :
The upper and lower bounds of 3: ( 3 , 4 ]
The upper and lower bounds of 2: ( 2 , 3 ]
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
lower_bound, equal_range
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee