Spec-Zone.ru › C++

std::unique_copy

Определено в заголовочном файле <algorithm>
(1)
template< class InputIt, class OutputIt >
OutputIt unique_copy( InputIt first, InputIt last, OutputIt d_first );
(до C++20)
template< class InputIt, class OutputIt >
constexpr OutputIt unique_copy( InputIt first, InputIt last, OutputIt d_first );
(с C++20)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt2 unique_copy( ExecutionPolicy&& policy, ForwardIt1 first,
                        ForwardIt1 last, ForwardIt2 d_first );
(2) (с C++17)
(3)
template< class InputIt, class OutputIt, class BinaryPredicate >
OutputIt unique_copy( InputIt first, InputIt last,
                      OutputIt d_first, BinaryPredicate p );
(до C++20)
template< class InputIt, class OutputIt, class BinaryPredicate >
constexpr OutputIt unique_copy( InputIt first, InputIt last,
                                OutputIt d_first, BinaryPredicate p );
(с C++20)
template< class ExecutionPolicy, class ForwardIt1,
          class ForwardIt2, class BinaryPredicate >
ForwardIt2 unique_copy( ExecutionPolicy&& policy,
                        ForwardIt1 first, ForwardIt1 last,
                        ForwardIt2 d_first, BinaryPredicate p );
(4) (с C++17)

Копирует элементы из диапазона [first, last), в другой диапазон, начинающийся с d_first, таким образом, что нет последовательных равных элементов. Копируется только первый элемент каждой группы равных элементов.

1) Элементы сравниваются с использованием operator==. Поведение не определено, если это не отношение эквивалентности.
3) Элементы сравниваются с использованием заданного бинарного предиката p. Поведение не определено, если это не отношение эквивалентности.
2,4) То же, что (1,3), но выполняется в соответствии с policy. Эти перегрузки не участвуют в разрешении перегрузки, если

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> является true.

(до C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> является true.

(с C++20)

Параметры

first, last - диапазон элементов для обработки
d_first - начало целевого диапазона
policy - политика выполнения. Подробнее см. в политике выполнения.
p - бинарный предикат, возвращающий ​true, если элементы следует считать равными.

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

bool pred(const Type1 &a, const Type2 &b);

Хотя подпись не обязательно должна иметь const &, функция не должна изменять переданные ей объекты и должна уметь принимать все значения типа (возможно, const) Type1 и Type2 независимо от категории значения (следовательно, Type1 & не допускается, также как и Type1 за исключением случаев, когда для Type1 перемещение эквивалентно копированию(с C++11)).
Типы Type1 и Type2 должны быть такими, чтобы объект типа InputIt можно было разыменовать, а затем неявно преобразовать в оба из них. ​

Требования к типу
-InputIt должен соответствовать требованиям LegacyInputIterator.
-OutputIt должен соответствовать требованиям LegacyOutputIterator.
-ForwardIt1, ForwardIt2 должен соответствовать требованиям LegacyForwardIterator.
-Тип разыменованного InputIt должен соответствовать требованиям CopyAssignable. если InputIt не удовлетворяет LegacyForwardIterator.
-Тип разыменованного InputIt должен соответствовать требованиям CopyConstructible. если
  • ни InputIt ни OutputIt не удовлетворяет LegacyForwardIterator, или
  • InputIt не удовлетворяет LegacyForwardIterator и тип значения InputIt отличается от типа значения OutputIt.

Возвращаемое значение

Итератор вывода на элемент после последнего записанного элемента.

Сложность

Для непустых диапазонов, ровно std::distance(first, last) - 1 применений соответствующего предиката.

Исключение

Перегрузки с параметром шаблона, названным ExecutionPolicy сообщают об ошибках следующим образом:

  • Если выполнение функции, вызванной как часть алгоритма, вызывает исключение, и ExecutionPolicy является одной из стандартных политик, std::terminate вызывается. Для любой другой ExecutionPolicy, поведение определяется реализацией.
  • Если алгоритм не удается выделить память, std::bad_alloc выбрасывается.

Примечания

Если InputIt удовлетворяет LegacyForwardIterator, эта функция повторно считывает входные данные, чтобы обнаружить дубликаты.

В противном случае, если OutputIt удовлетворяет LegacyForwardIterator, а тип значения InputIt совпадает с типом значения OutputIt, эта функция сравнивает *d_first с *first.

В противном случае, эта функция сравнивает *first с локальной копией элемента.

Для перегрузок с ExecutionPolicy, может быть затрачена производительность, если тип значения ForwardIt1 не является одновременно CopyConstructible и CopyAssignable.

Возможная реализация

См. также реализации в libstdc++ и libc++.

Пример

#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
 
int main()
{
    std::string s1 {"The      string    with many       spaces!"};
    std::cout << "before: " << s1 << '\n';
 
    std::string s2;
    std::unique_copy(s1.begin(), s1.end(), std::back_inserter(s2),
                     [](char c1, char c2) { return c1 == ' ' && c2 == ' '; });
 
    std::cout << "after:  " << s2 << '\n';
}

Вывод:

before: The      string    with many       spaces!
after:  The string with many spaces!

Отчеты об ошибках

Следующие поведенческие отчеты об ошибках были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение, опубликованное Корректное поведение
LWG 239 C++98 предикат применялся last - first раз применялся last - first - 1 раз
LWG 241 C++98 тип значения InputIt не требовалось быть CopyConstructible условно требовалось
LWG 538 C++98 тип значения InputIt не требовалось быть CopyAssignable условно требовалось

См. также

adjacent_find
находит первые два смежных элемента, которые равны (или удовлетворяют заданному предикату)
(функция-шаблон)
unique
удаляет последовательные дублирующиеся элементы в диапазоне
(функция-шаблон)
copycopy_if
(C++11)
копирует диапазон элементов в новое местоположение
(функция-шаблон)
ranges::unique_copy
(C++20)
создает копию некоторого диапазона элементов, который не содержит последовательных дубликатов
(niebloid)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/algorithm/unique_copy

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API