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 нельзя записать в 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. в этом случае поведение не определено |
См. также
| разделяет диапазон элементов на две группы (шаблон функции и объект-функция алгоритма) |
|
|
(C++20) | |
| разделяет элементы на две группы, сохраняя их взаимный порядок в каждой группе (шаблон функции и объект-функция алгоритма) |
|
|
(C++20) | |
|
(C++11) | копирует диапазон элементов в новое место (шаблон функции и объект-функция алгоритма) |
|
(C++20)(C++20) | |
| копирует диапазон элементов, исключая те, которые удовлетворяют заданным критериям (шаблон функции и объект-функция алгоритма) |
|
|
(C++20)(C++20) | |
|
(C++20) | копирует диапазон, разделяя элементы на две группы (объект-функция алгоритма) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/partition_copy