[section:stable_partition stable_partition]

[heading Prototype]

``
template<class ForwardRange, class UnaryPredicate>
typename range_iterator<ForwardRange>::type
stable_partition(ForwardRange& rng, UnaryPredicate pred);

template<class ForwardRange, class UnaryPredicate>
typename range_iterator<const ForwardRange>::type
stable_partition(const ForwardRange& rng, UnaryPredicate pred);

template<
    range_return_value re,
    class ForwardRange,
    class UnaryPredicate
>
typename range_return<ForwardRange, re>::type
stable_partition(ForwardRange& rng, UnaryPredicate pred);

template<
    range_return_value re,
    class ForwardRange,
    class UnaryPredicate
>
typename range_return<const ForwardRange, re>::type
stable_partition(const ForwardRange& rng, UnaryPredicate pred);
``

[heading Description]

`stable_partition` reorders the elements in the range `rng` base on the function object `pred`. Once this function has completed all of the elements that satisfy `pred` appear before all of the elements that fail to satisfy it. `stable_partition` differs from `partition` because it preserves relative order. It is stable.

For the versions that return an iterator, the return value is the iterator to the first element that fails to satisfy `pred`.

For versions that return a `range_return`, the `found` iterator is the iterator to the first element that fails to satisfy `pred`.

[heading Definition]

Defined in the header file `boost/range/algorithm/stable_partition.hpp`

[heading Requirements]

* `ForwardRange` is a model of the __forward_range__ Concept.
* `ForwardRange` is mutable.
* `UnaryPredicate` is a model of the `PredicateConcept`.

[heading Complexity]

Best case: `O(N)` where `N` is `distance(rng)`.
Worst case: `N * log(N)` swaps, where `N` is `distance(rng)`.

[endsect]


