std::unique_copy
![]() |
This page has been machine-translated from the English version of the wiki using Google Translate.
The translation may contain errors and awkward wording. Hover over text to see the original version. You can help to fix errors and improve the translation. For instructions click here. |
Определено в заголовочном файле <algorithm>
|
||
template< class InputIt, class OutputIt > ForwardIt unique_copy( InputIt first, InputIt last, |
(1) | |
template< class InputIt, class OutputIt, class BinaryPredicate > ForwardIt unique_copy( InputIt first, InputIt last, |
(2) | |
[first, last)
, в другой диапазон начало в d_first
таким образом, что нет никаких последовательных одинаковых элементов. Только первый элемент каждой группы равных элементов копируется. Первый вариант используется operator==
для сравнения элементов, вторая версия использует данный бинарный предикат p
.[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
.Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
Содержание |
[править] Параметры
first, last | - | диапазон элементов в процессе
Оригинал: the range of elements to process Текст был переведён автоматически через Google Translate. Вы можете проверить и исправить перевод. Для инструкций кликните сюда. |
d_first | - | В начале назначения диапазона
Оригинал: the beginning of the destination range Текст был переведён автоматически через Google Translate. Вы можете проверить и исправить перевод. Для инструкций кликните сюда. |
p | - | бинарный предикат, который возвращает true если элементы следует считать равными. Определение функции предиката должно быть эквивалентно следующему: bool pred(const Type1 &a, const Type2 &b); Определение не должно обязательно содержать const &, но функция не должна модифицировать принимаемые объекты. |
Требования к типам | ||
-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
|
[править] Возвращаемое значение
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
[править] Возможная реализация
Первый вариант |
---|
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; } |
[править] Пример
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
#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
first
and last
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
[править] См. также
Ищет в диапазоне два одинаковых смежных элемента (шаблон функции) | |
removes consecutive duplicate elements in a range (шаблон функции) |