std::partition_copy
| Определён в заголовке <algorithm>
|
||
template< class InputIt, class OutputIt1,
class OutputIt2, class UnaryPred >
std::pair<OutputIt1, OutputIt2>
partition_copy( InputIt first, InputIt last,
OutputIt1 d_first_true, OutputIt2 d_first_false,
UnaryPred p );
|
(1) | (начиная с C++11) (constexpr начиная с C++20) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2,
class ForwardIt3, class UnaryPred >
std::pair<ForwardIt2, ForwardIt3>
partition_copy( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last,
ForwardIt2 d_first_true, ForwardIt3 d_first_false,
UnaryPred p );
|
(2) | (начиная с C++17) |
[first, last) в два разных диапазона в зависимости от значения, возвращаемого предикатом p.
- Элементы, удовлетворяющие предикату
p, копируются в диапазон, начинающийся сd_first_true. - Остальные элементы копируются в диапазон, начинающийся с
d_first_false.
policy.true:
|
|
(до C++20) |
|
|
(начиная с C++20) |
Если *first не является writable в d_first_true или d_first_false, программа считается некорректной.
Если какие-либо два диапазона из входного и двух выходных перекрываются, поведение не определено.
Параметры
| first, last | - | пара итераторов, определяющая исходный диапазон элементов для копирования |
| d_first_true | - | начало выходного диапазона для элементов, удовлетворяющих p
|
| d_first_false | - | начало выходного диапазона для элементов, не удовлетворяющих p
|
| policy | - | политика выполнения для использования |
| p | - | унарный предикат, который возвращает true, если элемент должен быть помещён в d_first_true. Выражение |
| Требования к типам | ||
-InputIt должен удовлетворять требованиям LegacyInputIterator.
| ||
-OutputIt1, OutputIt2 должен удовлетворять требованиям LegacyOutputIterator.
| ||
-ForwardIt1, ForwardIt2, ForwardIt3 должен удовлетворять требованиям LegacyForwardIterator.
| ||
-UnaryPred должен удовлетворять требованиям Predicate.
| ||
Возвращаемое значение
std::pair, построенный из итератора на конец диапазона d_first_true и итератора на конец диапазона d_first_false.
Сложность
Ровно std::distance(first, last) применений p.
Для перегрузки (2) может возникнуть потеря производительности, если тип значения ForwardIt не является CopyConstructible.
Исключения
Перегрузка с параметром шаблона с именем ExecutionPolicy сообщает об ошибках следующим образом:
- Если выполнение функции, вызванной в рамках алгоритма, генерирует исключение, и
ExecutionPolicyявляется одной из стандартных политик, вызывается std::terminate. Для любой другойExecutionPolicyповедение определяется реализацией. - Если алгоритму не удаётся выделить память, генерируется std::bad_alloc.
Возможная реализация
| partition_copy (1) |
|---|
template<class InputIt, class OutputIt1,
class OutputIt2, class UnaryPred>
constexpr //< since C++20
std::pair<OutputIt1, OutputIt2>
partition_copy(InputIt first, InputIt last,
OutputIt1 d_first_true, OutputIt2 d_first_false,
UnaryPred p)
{
for (; first != last; ++first)
{
if (p(*first))
{
*d_first_true = *first;
++d_first_true;
}
else
{
*d_first_false = *first;
++d_first_false;
}
}
return std::pair<OutputIt1, OutputIt2>(d_first_true, d_first_false);
}
|
Пример
#include <algorithm>
#include <iostream>
#include <utility>
void print(auto rem, const auto& v)
{
for (std::cout << rem; const auto& x : v)
std::cout << x << ' ';
std::cout << '\n';
}
int main()
{
int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
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 4 < i; });
print("true_arr: ", true_arr);
print("false_arr: ", false_arr);
}
Вывод:
true_arr: 5 6 7 8 9
false_arr: 0 1 2 3 4
Отчёты о дефектах
Следующие отчёты о дефектах, изменяющие поведение, были применены ретроспективно к ранее опубликованным стандартам C++.
| DR | Применён к | Поведение как опубликовано | Корректное поведение |
|---|---|---|---|
| P0896R4 | C++11 C++17 |
1. тип значения InputIt (C++11)/ForwardIt1 (C++17)должен был быть CopyAssignable 2. два выходных диапазона могли перекрываться |
1. не требуется 2. в этом случае поведение не определено |
См. также
| делит диапазон элементов на две группы (шаблон функции & алгоритм function object) | |
(C++20) |
|
| делит элементы на две группы, сохраняя относительный порядок внутри каждой группы (шаблон функции & алгоритм function object) | |
(C++20) |
|
(C++11) |
копирует диапазон элементов в новое местоположение (шаблон функции & алгоритм function object) |
(C++20)(C++20) |
|
| копирует диапазон элементов, пропуская те, которые удовлетворяют определённым критериям (шаблон функции & алгоритм function object) | |
(C++20)(C++20) |
|
(C++20) |
копирует диапазон, разделяя элементы на две группы (алгоритм function object) |