std::stable_partition
Определён в заголовочном файле <algorithm> | ||
|---|---|---|
template< class BidirIt, class UnaryPred > BidirIt stable_partition( BidirIt first, BidirIt last, UnaryPred p ); | (1) | (constexpr начиная с C++26) |
template< class ExecutionPolicy, class BidirIt, class UnaryPred >
BidirIt stable_partition( ExecutionPolicy&& policy,
BidirIt first, BidirIt last, UnaryPred p );
| (2) | (начиная с C++17) |
[first, last) так, чтобы все элементы, для которых предикат p возвращает true, находились перед элементами, для которых предикат p возвращает false. Относительный порядок элементов сохраняется.policy.true: |
| (до C++20) |
|
| (начиная с C++20) |
Если выполняется любое из следующих условий, поведение не определено:
| (до C++11) |
| (начиная с C++11) |
Параметры
| first, last | - | пара итераторов, задающих диапазон элементов для перестановки |
| policy | - | политика выполнения |
| p | - | унарный предикат, возвращающий true, если элемент должен находиться перед другими элементами. Выражение |
| Требования к типам | ||
-BidirIt должен удовлетворять требованиям LegacyBidirectionalIterator. |
||
-UnaryPred должен удовлетворять требованиям Predicate. |
||
Возвращаемое значение
Итератор на первый элемент второй группы.
Сложность
Пусть \(\scriptsize N\)N — std::distance(first, last):
p.p.Исключения
Перегрузка с параметром шаблона с именем ExecutionPolicy сообщает об ошибках следующим образом:
- Если выполнение функции, вызванной в составе алгоритма, приводит к выбросу исключения и
ExecutionPolicyявляется одной из стандартных политик, вызываетсяstd::terminate. Для любого другогоExecutionPolicyповедение определяется реализацией. - Если алгоритму не удаётся выделить память, выбрасывается
std::bad_alloc.
Примечания
Эта функция пытается выделить временный буфер. Если выделение памяти не удаётся, выбирается менее эффективный алгоритм.
Реализации в libc++ и libstdc++ также принимают диапазоны, задаваемые LegacyForwardIterators, в качестве расширения.
| Макрос проверки поддержки возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_constexpr_algorithms | 202306L | (C++26) | constexpr стабильная сортировка (1) |
Пример
#include <algorithm>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v{0, 0, 3, -1, 2, 4, 5, 0, 7};
std::stable_partition(v.begin(), v.end(), [](int n) { return n > 0; });
for (int n : v)
std::cout << n << ' ';
std::cout << '\n';
}
Вывод:
3 2 4 5 7 0 0 -1 0
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроспективно к ранее опубликованным стандартам C++.
| DR | Применён к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| LWG 2150 | C++98 |
std::stable_partition требовалось лишь поместить одинэлемент, удовлетворяющий p, перед одним элементом, не удовлетворяющим p | требование исправлено |
См. также
| разделяет диапазон элементов на две группы (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
|
(C++20) | разделяет элементы на две группы, сохраняя их относительный порядок внутри каждой группы (функциональный объект-алгоритм) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/stable_partition