std::partition_copy
Определено в заголовке <algorithm> |
||
|---|---|---|
| (1) | ||
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 ); |
(с C++11) (до C++20) |
|
template< class InputIt, class OutputIt1,
class OutputIt2, class UnaryPredicate >
constexpr std::pair<OutputIt1, OutputIt2>
partition_copy( InputIt first, InputIt last,
OutputIt1 d_first_true, OutputIt2 d_first_false,
UnaryPredicate p );
|
(с C++20) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2,
class ForwardIt3, class UnaryPredicate >
std::pair<ForwardIt2, ForwardIt3>
partition_copy( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last,
ForwardIt2 d_first_true, ForwardIt3 d_first_false,
UnaryPredicate p );
|
(2) | (с C++17) |
[first, last) в два разных диапазона в зависимости от значения, возвращаемого предикатом p. Элементы, удовлетворяющие предикату p, копируются в диапазон, начинающийся с d_first_true. Остальные элементы копируются в диапазон, начинающийся с d_first_false.policy. Этот перегруз не участвует в разрешении перегрузки, если |
| (до C++20) |
|
| (с C++20) |
Параметры
| first, last | - | диапазон копируемых элементов |
| d_first_true | - | начало выходного диапазона для элементов, удовлетворяющих p |
| d_first_false | - | начало выходного диапазона для элементов, не удовлетворяющих p |
| policy | - | используемая стратегия выполнения. Подробнее см. в стратегии выполнения. |
| p | - | унарный предикат, который возвращает true, если элемент должен быть помещён в d_first_true. Выражение |
| Требования к типу | ||
-InputIt должен удовлетворять требованиям LegacyInputIterator. |
||
-Тип разыменования InputIt должен удовлетворять требованиям CopyAssignable. |
||
-OutputIt1, OutputIt2 должен удовлетворять требованиям LegacyOutputIterator. |
||
-ForwardIt1, ForwardIt2, ForwardIt3 должен удовлетворять требованиям LegacyForwardIterator. Тип значения ForwardIt1 должен быть CopyAssignable, записываемый в ForwardIt2 и ForwardIt3, и преобразуемый к типу аргумента UnaryPredicate. |
||
-UnaryPredicate должен удовлетворять требованиям Predicate. |
||
Возвращаемое значение
A std::pair, построенная из итератора до конца диапазона d_first_true и итератора до конца диапазона d_first_false.
Сложность
Ровно std::distance(first, last) применений p.
Для перегрузки со стратегией выполнения может быть затрачена производительность, если тип значения ForwardIt не является CopyConstructible.
Исключение
Перегрузка с параметром-шаблоном, именем ExecutionPolicy сообщает об ошибках следующим образом:
- Если выполнение функции, вызванной в рамках алгоритма, выбрасывает исключение, и
ExecutionPolicyявляется одной из стандартных стратегий, тоstd::terminateвызывается. Для любой другойExecutionPolicy, поведение определяется реализацией. - Если алгоритм не может выделить память, выбрасывается
std::bad_alloc.
Возможная реализация
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)
{
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, auto const& v)
{
for (std::cout << rem; auto const& 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++11) |
копирует диапазон элементов в новое место (функция-шаблон) |
| копирует диапазон элементов, опуская те, которые удовлетворяют определённым критериям (функция-шаблон) |
|
|
(C++20) |
копирует диапазон, разделяя элементы на две группы (niebloid) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/algorithm/partition_copy