◐ Shell
clean mode source ↗

std::unique_copy — cppreference.com

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

<metanoindex/>

<tbody> </tbody>

Определено в заголовочном файле <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.

Оригинал:

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.

Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Параметры

first, last

диапазон элементов в процессе

Оригинал:

the range of elements to process

Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

d_first

В начале назначения диапазона

Оригинал:

the beginning of the destination range

Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

p бинарный предикат, который возвращает ​true если элементы следует считать равными.

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

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

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

Требования к типам
-InputIt должен соответствовать требованиям InputIterator.
-OutputIt должен соответствовать требованиям OutputIterator.
-The type of dereferenced InputIt must meet the requirements of CopyAssignable.
-The type of dereferenced InputIt must meet the requirements of CopyConstructible. if neither InputIt nor OutputIt satisfies ForwardIterator

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

Выходной итератор на элемент, следующий за последним элементом написано

Оригинал:

Output iterator to the element past the last written element

Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

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

Первый вариант
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;
}

Пример

Следующие урезает программу все несколько последовательных пробелов в константной строки и печатает результат

Оригинал:

The following program trims all multiple consecutive spaces in a const string and prints the result

Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

#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

Оригинал:

linear in the distance between first and last

Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

См. также

находит первые два соседних элемента, которые равны (или удовлетворяют заданному предикату)
(шаблон функции) [править]
удаляет последовательные повторяющиеся элементы в диапазоне
(шаблон функции) [править]