adjacent_difference

[機能]

  隣接する要素間の差からなる系列を計算します.2 番目の形式では,2 引数関数
  <T> binary_op(<T>n1, <T>n2)
によって,差の計算方法を指定できます.この関数において,n1 及び n2 が,前回及び今回の要素の値を示します.

[形式]
#include <numeric>

template <class InputIterator, class OutputIterator>
    OutputIterator adjacent_difference(InputIterator first, InputIterator last,
                                       OutputIterator result);
template <class InputIterator, class OutputIterator, class BinaryOperation>
    OutputIterator adjacent_difference(InputIterator first, InputIterator last,
                                       OutputIterator result,
                                       Binary_operation binary_op);		

[使用例]

  1. adjacent_difference と iota の使用方法です.以下に示すプログラム例において,いくつかのコメント部分は,その上に記述された方法とほぼ同等なものであることを示しています(複数行の対応関係である場合もある).
    #include <stdio.h>
    #include <vector>
    #include <numeric>
    
    using namespace std;
    
    int sum(int n1, int n2)
    {
    	return 2 * (n1 - n2);
    }
    
    int main()
    {
    			// 初期設定
    	vector<int> v1 {1, 3, 6, 2, 1};
    	printf("v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n");
    			// v1 の各要素の差からなる系列
    	printf("v1 の各要素の差からなる系列\n");
    	vector<int> v2;
    	adjacent_difference(v1.begin(), v1.end(), inserter(v2, v2.begin()));   // inserter 参照
    //	vector<int> v2(5);   // inserter を利用しない場合は,大きさを前もって指定する必要がある
    //	adjacent_difference(v1.begin(), v1.end(), v2.begin());
    	printf("  v2 :");
    	for (auto x : v2)
    		printf("  %d", x);
    	printf("\n");
    			// v1 の各要素の差の 2 倍からなる系列(最初は v1 の 1 番目の要素と必ず一致)
    	printf("v1 の各要素の差の 2 倍からなる系列(最初は v1 の 1 番目の要素と必ず一致)\n");
    	vector<int> v3;
    	adjacent_difference(v1.begin(), v1.end(), inserter(v3, v3.begin()), sum);   // 関数
    //	adjacent_difference(v1.begin(), v1.end(), inserter(v3, v3.begin()), [](int x, int y){ return 2 * (x - y); });   // ラムダ式
    //	vector<int> v3(5);
    //	adjacent_difference(v1.begin(), v1.end(), v3.begin(), sum);
    //	adjacent_difference(v1.begin(), v1.end(), v3.begin(), [](int x, int y){ return 2 * (x - y); });
    	printf("  v3 :");
    	for (auto x : v3)
    		printf("  %d", x);
    	printf("\n");
    			// 5 から始まる 10 個の正数列
    	printf("5 から始まる 10 個の正数列\n");
    	vector<int> v4(10);
    	iota(v4.begin(), v4.end(), 5);
    	printf("  v4 :");
    	for (auto x : v4)
    		printf("  %d", x);
    	printf("\n");
    
    	return 0;
    }
    			
    (出力)
    v1 :  1  3  6  2  1
    v1 の各要素の差からなる系列
      v2 :  1  2  3  -4  -1
    v1 の各要素の差の 2 倍からなる系列(最初は v1 の 1 番目の要素と必ず一致)
      v3 :  1  4  6  -8  -2
    5 から始まる 10 個の正数列
      v4 :  5  6  7  8  9  10  11  12  13  14			
[参照]

iota

菅沼ホーム 本文目次 演習問題解答例 付録目次 索引