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

std::adjacent_difference

Материал из cppreference.com
< cpp‎ | algorithm

 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами(C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Политики исполнения (C++17)
Немодифицирующие операции над последовательностями
(C++11)(C++11)(C++11)
(C++17)
Модифицирующие операции над последовательностями
Операции разбиения
Операции сортировки
Операции двоичного поиска
Операции с наборами (в отсортированных диапазонах)
Операции с кучей
(C++11)
Операций минимума/максимума
(C++11)
(C++17)

Операции перестановки
Числовые операции
(C++11)
adjacent_difference
Операции с неинициализированной памятью
(C++17)
(C++17)
(C++17)
Библиотека C
 
Определено в заголовочном файле <numeric>
template<class InputIt, class OutputIt >

OutputIt adjacent_difference( InputIt first, InputIt last,

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

OutputIt adjacent_difference( InputIt first, InputIt last,
                                    OutputIt d_first,

                                    BinaryOperation op );
(2)
Вычисляет различие между вторым и первым из каждой пары соседних элементов диапазона [first, last) и записывает их в диапазоне начиная с d_first + 1. Немодифицированного копию first записывается в d_first. Первый вариант используется для расчета operator- различия, вторая версия использует данную функцию двоичного op.
Оригинал:
Computes the differences between the second and the first of each adjacent pair of elements of the range [first, last) and writes them to the range beginning at d_first + 1. Unmodified copy of first is written to d_first. The first version uses operator- to calculate the differences, the second version uses the given binary function op.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Эквивалентная операция
Оригинал:
Equivalent operation:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
*(d_first)=*first;*(d_first+1)=(*first+1)-*(first);*(d_first+2)=(*first+2)-*(first+1);*(d_first+3)=(*first+3)-*(first+2); ...

Содержание

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

first, last
диапазон элементов
Оригинал:
the range of elements
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
d_first
В начале назначения диапазона
Оригинал:
the beginning of the destination range
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
op binary operation function object that will be applied.

The signature of the function should be equivalent to the following:

 Ret fun(const Type1 &a, const Type2 &b);

The signature does not need to have const&.
Типы Type1 и Type2 должны быть таковы, что объект типа iterator_traits<InputIt>::value_type может быть преобразован в оба из них. Тип Ret должен быть таков, что объект типа OutputIt может быть разыменован, а результату разыменования присвоено значение типа Ret. ​

Требования к типам
-
InputIt должен соответствовать требованиям InputIterator.
-
OutputIt должен соответствовать требованиям OutputIterator.

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

Это на элемент после последнего элемента написано.
Оригинал:
It to the element past the last element written.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

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

Именно (last - first) - 1 применения бинарной операции
Оригинал:
Exactly (last - first) - 1 applications of the binary operation
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

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

Первый вариант
template<class InputIt, class OutputIt> OutputIt adjacent_difference(InputIt first, InputIt last, OutputIt d_first){if(first == last)return d_first;   typedeftypenamestd::iterator_traits<InputIt>::value_type value_t; value_t acc =*first;*d_first = acc;while(++first != last){ value_t val =*first;*++d_first = val - acc; acc = std::move(val);}return++d_first;}
Второй вариант
template<class InputIt, class T, class BinaryOperation> OutputIt adjacent_difference(InputIt first, InputIt last, OutputIt d_first, BinaryOperation op){if(first == last)return d_first;   typedeftypenamestd::iterator_traits<InputIt>::value_type value_t; value_t acc =*first;*d_first = acc;while(++first != last){ value_t val =*first;*++d_first = op(val, acc); acc = std::move(val);}return++d_first;}

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

Следующий код преобразует последовательность четных чисел на повторение числа 2 и преобразует последовательности единиц в последовательности чисел Фибоначчи .
Оригинал:
The following code converts a sequence of even numbers to repetitions of the number 2 and converts a sequence of ones to a sequence of Fibonacci numbers.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

#include <numeric>#include <vector>#include <iostream>#include <functional>int main(){std::vector<int> v{2, 4, 6, 8, 10, 12, 14, 16, 18, 20}; std::adjacent_difference(v.begin(), v.end(), v.begin());   for(auto n: v){std::cout<< n <<' ';}std::cout<<'\n';   v ={1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; std::adjacent_difference(v.begin(), v.end()-1, v.begin()+1, std::plus<int>()   for(auto n: v){std::cout<< n <<' ';}std::cout<<'\n';}

Вывод:

2 2 2 2 2 2 2 2 2 2 1 1 2 3 5 8 13 21 34 55

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

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