Namespaces
Variants
Views
Actions

std::partition_copy

From cppreference.com
< cpp‎ | algorithm
Revision as of 18:17, 22 January 2013 by Nate (Talk | contribs)

 
 
 

Template:ddcl list begin <tr class="t-dsc-header">

<td>
Defined in header <algorithm>
</td>

<td></td> <td></td> <tr class="t-dcl ">

<td >
template< class InputIt, class OutputIt1,

          class OutputIt2, class UnaryPredicate >
std::pair<OutputIt1, OutputIt2>
     partition_copy(InputIt first, InputIt last,
                    OutputIt1 d_first_true, OutputIt2 d_first_false,

                    UnaryPredicate p);
</td>

<td class="t-dcl-nopad"> </td> <td > (since C++11) </td> </tr> Template:ddcl list end

Copies the elements that satisfy the predicate p from the range [first, last) to the range beginning at d_first_true, and copies the elements that do not satisfy p to the range beginning at d_first_false.

Contents

Parameters

first, last - the range of elements to sort
d_first_true - the beginning of the output range for the elements that satisfy p
d_first_false - the beginning of the output range for the elements that do not satisfy p
p - unary predicate which returns ​true if the element should be placed in d_first_true.

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 InputIt can be dereferenced and then implicitly converted to Type. ​

Type requirements
-
InputIt must meet the requirements of InputIterator.
-
OutputIt1 must meet the requirements of OutputIterator.
-
OutputIt2 must meet the requirements of OutputIterator.
-
UnaryPredicate must meet the requirements of Predicate.

Return value

A pair constructed from the iterator to the end of the d_first_true range and the iterator to the end of the d_first_false range.

Complexity

Exactly distance(first, last) applications of p.

Possible implementation

template<class InputIt, class OutputIt1,
         class OutputIt2, class UnaryPredicate>
std::pair<OutputIt1, OutputIt2>
    partition_copy(InputIt first, InputIt last,
                   OutputIt1 d_first_true, OutputIt2 d_first_false,
                   UnaryPredicate p)
{
    while (first != last) {
        if (p(*first)) {
            *d_first_true = *first;
            ++d_first_true;
        } else {
            *d_first_false = *first;
            ++d_first_false;
        }
        ++first;
    }
    return std::pair<OutputIt1, OutputIt2>(d_first_true, d_first_false);
}

Example

#include <iostream>
#include <algorithm>
#include <utility>
 
int main()
{
    int arr [10] = {1,2,3,4,5,6,7,8,9,10};
    int true_arr [5] = {0};
    int false_arr [5] = {0};
 
    std::partition_copy(std::begin(arr), std::end(arr), std::begin(true_arr),std::begin(false_arr),
                        [] (int i) {return i > 5;});
 
    std::cout << "true_arr: ";
    for (auto it = std::begin(true_arr); it != std::end(true_arr); ++it) {
        std::cout << *it << ' ';
    }
    std::cout << '\n'; 
 
    std::cout << "false_arr: ";
    for (auto it = std::begin(false_arr); it != std::end(false_arr); ++it) {
        std::cout << *it << ' ';
    }
    std::cout << '\n'; 
 
    return 0;
 
}

Output:

true_arr: 6 7 8 9 10
false_arr: 1 2 3 4 5

See also

Template:cpp/algorithm/dcl list partitionTemplate:cpp/algorithm/dcl list stable partition