std::adjacent_difference
来自cppreference.com
该页由英文版wiki使用Google Translate机器翻译而来。
该翻译可能存在错误或用词不当。鼠标停留在文本上可以看到原版本。你可以帮助我们修正错误或改进翻译。参见说明请点击这里. |
在头文件 <numeric> 中定义
|
||
template< class InputIt, class OutputIt > OutputIt adjacent_difference( InputIt first, InputIt last, |
(1) | |
template< class InputIt, class OutputIt, class BinaryOperation > OutputIt adjacent_difference( InputIt first, InputIt last, |
(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
.相同的操作
*(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 | - | 的范围内的元素
|
d_first | - | 的目标范围的开头
原文: the beginning of the destination range |
op | - | 被使用的二元函数对象。 该函数的签名应当等价于: Ret fun(const Type1 &a, const Type2 &b); 签名中并不需要有 const &。 |
类型要求 | ||
-InputIt 必须满足 InputIterator 的要求。
| ||
-OutputIt 必须满足 OutputIterator 的要求。
|
[编辑] 返回值
它过去的最后一个元素的元素写的
原文:
It to the element past the last element written.
[编辑] 复杂度
究竟
(last - first) - 1
应用程序的二进制运算原文:
Exactly
(last - first) - 1
applications of the binary operation[编辑] 可能的实现
版本一 |
---|
template<class InputIt, class OutputIt> OutputIt adjacent_difference(InputIt first, InputIt last, OutputIt d_first) { if (first == last) return d_first; typedef typename std::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; typedef typename std::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.
#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
[编辑] 另请参阅
计算区间内元素的部分和 (函数模板) | |
计算区间内元素的和 (函数模板) |