Home Libraries People FAQ More

## Algorithm

```#include <boost/spirit/home/phoenix/algorithm.hpp>
```

The algorithm module provides wrappers for the standard algorithms in the <algorithm> and <numeric> headers.

The algorithms are divided into the categories iteration, transformation and querying, modelling the Boost.MPL library. The different algorithm classes can be included using the headers:

```#include <boost/spirit/home/phoenix/stl/algorithm/iteration.hpp>
#include <boost/spirit/home/phoenix/stl/algorithm/transformation.hpp>
#include <boost/spirit/home/phoenix/stl/algorithm/querying.hpp>
```

The functions of the algorithm module take ranges as arguments where appropriate. This is different to the standard library, but easy enough to pick up. Ranges are described in detail in the Boost.Range library.

For example, using the standard copy algorithm to copy between 2 arrays:

```int array[] = {1, 2, 3};
int output[3];
std::copy(array, array + 3, output); // We have to provide iterators
// to both the start and end of array
```

The analogous code using the phoenix algorithm module is:

```int array[] = {1, 2, 3};
int output[3];
copy(arg1, arg2)(array, output); // Notice only 2 arguments, the end of
// array is established automatically
```

The Boost.Range library provides support for standard containers, strings and arrays, and can be extended to support additional types.

The following tables describe the different categories of algorithms, and their semantics.

Table 1.7. Iteration Algorithms

Function

stl Semantics

for_each(r, c)

for_each(begin(r), end(r), f)

accumulate(r, o[, f])

accumulate(begin(r), end(r), o[, f])

Table 1.8. Querying Algorithms

Function

stl Semantics

find(r, a)

find(begin(r), end(r), a)

find_if(r, f)

find_if(begin(r), end(r), f)

find_end(r1, r2[, f])

find_end(begin(r1), end(r1), begin(r2), end(r2)[, f])

find_first_of(r1, r2[, f])

find_first_of(begin(r1), end(r1), begin(r2), end(r2)[, f])

count(r, a)

count(begin(r), end(r), a)

count_if(r, f)

count_if(begin(r), end(r), f)

distance(r)

distance(begin(r), end(r))

mismatch(r, i[, f])

mismatch(begin(r), end(r), i[, f])

equal(r, i[, f])

equal(begin(r), end(r), i[, f])

search(r1, r2[, f])

search(begin(r1), end(r1), begin(r2), end(r2)[, f])

lower_bound(r, a[, f])

lower_bound(begin(r), end(r), a[, f])

upper_bound(r, a[, f])

upper_bound(begin(r), end(r), a[, f])

equal_range(r, a[, f])

equal_range(begin(r), end(r), a[, f])

binary_search(r, a[, f])

binary_search(begin(r), end(r), a[, f])

includes(r1, r2[, f])

includes(begin(r1), end(r1), begin(r2), end(r2)[, f])

min_element(r[, f])

min_element(begin(r), end(r)[, f])

max_element(r[, f])

max_element(begin(r), end(r)[, f])

lexicographical_compare(r1, r2[, f])

lexicographical_compare(begin(r1), end(r1), begin(r2), end(r2)[, f])

Table 1.9. Transformation Algorithms

Function

stl Semantics

copy(r, o)

copy(begin(r), end(r), o)

copy_backward(r, o)

copy_backward(begin(r), end(r), o)

transform(r, o, f)

transform(begin(r), end(r), o, f)

transform(r, i, o, f)

transform(begin(r), end(r), i, o, f)

replace(r, a, b)

replace(begin(r), end(r), a, b)

replace_if(r, f, a)

replace(begin(r), end(r), f, a)

replace_copy(r, o, a, b)

replace_copy(begin(r), end(r), o, a, b)

replace_copy_if(r, o, f, a)

replace_copy_if(begin(r), end(r), o, f, a)

fill(r, a)

fill(begin(r), end(r), a)

fill_n(r, n, a)

fill_n(begin(r), n, a)

generate(r, f)

generate(begin(r), end(r), f)

generate_n(r, n, f)

generate_n(begin(r), n, f)

remove(r, a)

remove(begin(r), end(r), a)

remove_if(r, f)

remove_if(begin(r), end(r), f)

remove_copy(r, o, a)

remove_copy(begin(r), end(r), o, a)

remove_copy_if(r, o, f)

remove_copy_if(begin(r), end(r), o, f)

unique(r[, f])

unique(begin(r), end(r)[, f])

unique_copy(r, o[, f])

unique_copy(begin(r), end(r), o[, f])

reverse(r)

reverse(begin(r), end(r))

reverse_copy(r, o)

reverse_copy(begin(r), end(r), o)

rotate(r, m)

rotate(begin(r), m, end(r))

rotate_copy(r, m, o)

rotate_copy(begin(r), m, end(r), o)

random_shuffle(r[, f])

random_shuffle(begin(r), end(r), f)

partition(r, f)

partition(begin(r), end(r), f)

stable_partition(r, f)

stable_partition(begin(r), end(r), f)

sort(r[, f])

sort(begin(r), end(r)[, f])

stable_sort(r[, f])

stable_sort(begin(r), end(r)[, f])

partial_sort(r, m[, f])

partial_sort(begin(r), m, end(r)[, f])

partial_sort_copy(r1, r2[, f])

partial_sort_copy(begin(r1), end(r1), begin(r2), end(r2)[, f])

nth_element(r, n[, f])

nth_element(begin(r), n, end(r)[, f])

merge(r1, r2, o[, f])

merge(begin(r1), end(r1), begin(r2), end(r2), o[, f])

inplace_merge(r, m[, f])

inplace_merge(begin(r), m, end(r)[, f])

set_union(r1, r2, o[, f])

set_union(begin(r1), end(r1), begin(r2), end(r2)[, f])

set_intersection(r1, r2, o[, f])

set_intersection(begin(r1), end(r1), begin(r2), end(r2)[, f])

set_difference(r1, r2, o[, f])

set_difference(begin(r1), end(r1), begin(r2), end(r2)[, f])

set_symmetric_difference(r1, r2, o[, f])

set_symmetric_difference(begin(r1), end(r1), begin(r2), end(r2)[, f])

push_heap(r[, f])

push_heap(begin(r), end(r)[, f])

pop_heap(r[, f])

pop_heap(begin(r), end(r)[, f])

make_heap(r[, f])

make_heap(begin(r), end(r)[, f])

sort_heap(r[, f])

sort_heap(begin(r), end(r)[, f])

next_permutation(r[, f])

next_permutation(begin(r), end(r)[, f])

prev_permutation(r[, f])

prev_permutation(begin(r), end(r)[, f])

inner_product(r, o, a[, f1, f2])

inner_product(begin(r), end(r), o[, f1, f2])

partial_sum(r, o[, f])

partial_sum(begin(r), end(r), o[, f])