Пространства имён
Варианты
Действия

std::partition

Материал из cppreference.com
< cpp‎ | algorithm

 
 
Алгоритмы
Функции
Немодифицирующие линейные операции
Модифицирующие линейные операции
Разделение
is_partitioned(C++11)
partition
partition_copy(C++11)
Сортировка (на отсортированных промежутках)
Бинарный поиск (на отсортированных промежутках)
Множества (на отсортированных промежутках)
Куча
Минимум/максимум
Числовые операции
Библиотека C
 
Определено в заголовочном файле <algorithm>
template< class BidirIt, class UnaryPredicate >

BidirectionalIterator partition( BidirIt first, BidirIt last,
                                 UnaryPredicate p );
template< class ForwardIt, class UnaryPredicate >
ForwardIt partition( ForwardIt first, ForwardIt last,

                     UnaryPredicate p );
(до C++11)

(начиная с C++11)
Сортирует элементы в диапазоне [first, last) таким образом, что все элементы, для которых предикат возвращает p true предшествовать элементы, для которых предикат возвращает p false. Относительный порядок элементов не сохраняются.
Оригинал:
Reorders the elements in the range [first, last) in such a way that all elements for which the predicate p returns true precede the elements for which predicate p returns false. Relative order of the elements is not preserved.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Содержание

[править] Параметры

first, last -
диапазон элементов в порядок
Оригинал:
the range of elements to reorder
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
p - унарный предикат, который возвращает​true
если элемент должны быть заказаны до других элементов
Оригинал:
if the element should be ordered before other elements
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
.

Определение функции предиката должны быть эквивалентно следующему:

 bool pred(const Type &a);

Определение не должно иметь const &, но функция не должна модифицировать принимаемые объекты.
Тип Type должен быть таков, что объект типа ForwardIt может быть разыменован и затем неявно преобразован в Type. ​

Требования к типам
-
BidirIt должен соответствовать требованиям BidirectionalIterator.
-
ForwardIt должен соответствовать требованиям ValueSwappable and ForwardIterator. However, the operation is more efficient if ForwardIt also satisfies the requirements of BidirectionalIterator

[править] Возвращаемое значение

Итератор на первый элемент второй группы.
Оригинал:
Iterator to the first element of the second group.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Сложность

Именно last-first применения предиката и в большинстве свопы last-first. Если ForwardIt отвечает требованиям BidirectionalIterator на наиболее своп (last-first)/2 сделали.
Оригинал:
Exactly last-first applications of the predicate and at most last-first swaps. If ForwardIt meets the requirements of BidirectionalIterator at most (last-first)/2 swaps are done.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Возможная реализация

template<class BidirIt, class UnaryPredicate>
BidirIt partition(BidirIt first, BidirIt last, UnaryPredicate p)
{
    while (1) {
        while ((first != last) && p(*first)) {
            ++first;
        }
        if (first == last--) break;
        while ((first != last) && !p(*last)) {
            --last;
        }
        if (first == last) break;
        std::swap(*first++, *last);
    }
    return first;
}

[править] Пример

#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <vector>
 
bool is_even(int i) { return i % 2 == 0; }
 
int main()
{
    std::vector<int> v;
    for (int i = 0; i < 10; ++i) v.push_back(i);
 
    std::cout << "Original vector:\n    ";
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
 
    // Partition the vector
    std::vector<int>::iterator p =
        std::partition(v.begin(), v.end(), std::ptr_fun(is_even));
 
    std::cout << "\nPartitioned vector:\n    ";
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << "\nBefore partition:\n    ";
    std::copy(v.begin(), p,       std::ostream_iterator<int>(std::cout, " "));
    std::cout << "\nAfter partition:\n    ";
    std::copy(p,         v.end(), std::ostream_iterator<int>(std::cout, " "));
}

Возможный вывод:

Original vector:
    0 1 2 3 4 5 6 7 8 9
Partitioned vector:
    0 8 2 6 4 5 3 7 1 9
Before partition:
    0 8 2 6 4
After partition:
    5 3 7 1 9

[править] См. также

определяет, является ли диапазон разбивается данный предикат
Оригинал:
determines if the range is partitioned by the given predicate
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(шаблон функции) [edit]
разделяет элементы на две группы, сохраняя их относительный порядок
Оригинал:
divides elements into two groups while preserving their relative order
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(шаблон функции) [edit]