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, таким образом, что нет последовательных равных элементов. Копируется только первый элемент каждой группы равных элементов.
operator==. Поведение не определено, если это не отношение эквивалентности.p. Поведение не определено, если это не отношение эквивалентности.policy. Эти перегрузки не участвуют в разрешении перегрузки, если |
| (до C++20) |
|
| (с C++20) |
Параметры
| first, last | - | диапазон элементов для обработки |
| d_first | - | начало целевого диапазона |
| policy | - | политика выполнения. Подробнее см. в политике выполнения. |
| p | - | бинарный предикат, возвращающий true, если элементы следует считать равными. Подпись функции-предиката должна быть эквивалентна следующей:
Хотя подпись не обязательно должна иметь |
| Требования к типу | ||
-InputIt должен соответствовать требованиям LegacyInputIterator. |
||
-OutputIt должен соответствовать требованиям LegacyOutputIterator. |
||
-ForwardIt1, ForwardIt2 должен соответствовать требованиям LegacyForwardIterator. |
||
-Тип разыменованного InputIt должен соответствовать требованиям CopyAssignable. если InputIt не удовлетворяет LegacyForwardIterator. |
||
-Тип разыменованного InputIt должен соответствовать требованиям CopyConstructible. если
|
||
Возвращаемое значение
Итератор вывода на элемент после последнего записанного элемента.
Сложность
Для непустых диапазонов, ровно 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 | условно требовалось |
См. также
| находит первые два смежных элемента, которые равны (или удовлетворяют заданному предикату) (функция-шаблон) |
|
| удаляет последовательные дублирующиеся элементы в диапазоне (функция-шаблон) |
|
|
(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/unique_copy