std::partition

From Cppreference

Jump to: navigation, search
Defined in header <algorithm>

template< class ForwardIterator, class UnaryPredicate >

BidirectionalIterator partition( ForwardIterator first, ForwardIterator last,

                                 UnaryPredicate p );

Reorders the elements in the range [first, last) in such a way that all elements for which the predicate p returns true precede the elements for which predicate p returns false. Relative order of the elements is not preserved.

Contents

Parameters

first, last - the range of elements to reorder
p - unary predicate which returns ​true if the element should be ordered before other elements.

The signature of the predicate function should be equivalent to the following:

bool pred(const Type &a);

The signature does not need to have const &, but the function must not modify the objects passed to it.
The type ​Type​ must be such that an object of type ​ForwardIterator​ can be dereferenced and then implicitly converted to ​Type​. ​

Return value

iterator to the first element of the second group

Complexity

linear in the distance between first and last

Equivalent function

template<class BidirectionalIterator, class UnaryPredicate>
BidirectionalIterator partition(BidirectionalIterator first,
                                BidirectionalIterator last,
                                UnaryPredicate p)
{
    while (true) {
        while ((first != last) && p(*first)) {
            ++first;
        }
        if (first == last--) break;
        while ((first != last) && !p(*last)) {
            --last;
        }
        if (first == last) break;
        std::swap (*first++,*last);
    }
    return first;
}

Example

See also

stable_partition
divides elements into two groups while preserving their relative order
(function template)
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox
In other languages