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

std::unique_copy

Материал из cppreference.com

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

ForwardIt unique_copy( InputIt first, InputIt last,

                       OutputIt d_first );
(1)
template< class InputIt, class OutputIt, class BinaryPredicate >

ForwardIt unique_copy( InputIt first, InputIt last,

                       OutputIt d_first, BinaryPredicate p );
(2)
Копирует элементы из диапазона [first, last), в другой диапазон начало в d_first таким образом, что нет никаких последовательных одинаковых элементов. Только первый элемент каждой группы равных элементов копируется. Первый вариант используется operator== для сравнения элементов, вторая версия использует данный бинарный предикат p.
Original:
Copies the elements from the range [first, last), to another range beginning at d_first in such a way that there are no consecutive equal elements. Only the first element of each group of equal elements is copied. The first version uses operator== to compare the elements, the second version uses the given binary predicate p.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

Содержание

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

first, last -
диапазон элементов в процессе
Original:
the range of elements to process
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
d_first -
В начале назначения диапазона
Original:
the beginning of the destination range
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
p - бинарный предикат, который возвращает true, если элементы следует считать равными.

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

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

В сигнатуре не обязательно наличие const &, но функция не должна изменять переданные ей объекты.
Типы  Type1 и  Type2 должны быть таковы, что объект типа ForwardIt может быть разыменован и затем неявно преобразован в оба из них.

Требования, накладываемые на типы
-
InputIt должен соответствовать требованиям InputIterator.
-
OutputIt должен соответствовать требованиям OutputIterator.
-
Тип разыменованного InputIt должен соответствовать требованиям CopyAssignable.
-
Тип разыменованного InputIt должен соответствовать требованиям CopyConstructible. if neither InputIt nor OutputIt satisfies ForwardIterator

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

Выходной итератор на элемент, следующий за последним элементом написано
Original:
Output iterator to the element past the last written element
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

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

Первый вариант
template<class ForwardIt, class OutputIt>
ForwardIt unique_copy(ForwardIt first, ForwardIt last,
                      OutputIt d_first)
{
 
    if (first == last)
        return d_first;
 
    *d_first = *first;
     while (++first != last) {
        if (!(*d_first == *first)) {
            *(++d_first) = *first;
        }
    }
    return ++d_first;
}
Второй вариант
template<class ForwardIt, class OutputIt, class BinaryPredicate>
ForwardIt unique_copy(ForwardIt first, ForwardIt last,
                            OutputIt d_first, BinaryPredicate p)
{
 
    if (first == last)
        return d_first;
 
    *d_first = *first;
    while (++first != last) {
        if (!p(*result, *first)) {
            *(++d_first) = *first;
        }
    }
    return ++d_first;
}

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

Следующие урезает программу все несколько последовательных пробелов в константной строки и печатает результат
Original:
The following program trims all multiple consecutive spaces in a const string and prints the result
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

#include <string>
#include <iostream>
#include <algorithm>
#include <iterator>
 
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!

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

линейные по расстоянию между first и last
Original:
linear in the distance between first and last
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

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

найти два одинаковых (или некоторых других отношениях) элементы примыкают друг к другу
Original:
finds two identical (or some other relationship) items adjacent to each other
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

(шаблон функции) [edit]
removes consecutive duplicate elements in a range
(шаблон функции) [edit]