とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

たまには adjacent_difference のことを思い出してあげてください

等差数列 - タイトル
404 Blog Not Found:algorithm - mapBetween - 配列の隣接する2項にそれぞれ演算を施した配列

各言語に標準装備されていないのがちょっと不思議なほど。

"各言語" に C++ は入っていないのか!と希望通り釣られてみる。
C++ なら標準装備されています。adjacent_difference を使いましょう。binary_op を指定すれば difference 以外も得られます。

#include<vector>
#include<numeric>
#include<iterator>
#include<iostream>

template<class Range>
void print(Range const & r)
{
 for(auto i: r)
  std::cout << i << ", ";
 std::cout << std::endl;
}

int main()
{
 {
  std::vector<int> const in{0, 1, 4, 9};
  std::vector<int> out;
  std::adjacent_difference(in.begin(), in.end(), std::back_inserter(out));
  print(out);
 }
 {
  std::vector<int> const in{1, 2, 3, 4, 5};
  std::vector<int> out;
  std::adjacent_difference(in.begin(), in.end(), std::back_inserter(out),
                           [](int a, int b){return a + b;});
  print(out);
 }
}

実行結果:

0, 1, 3, 5,
1, 3, 5, 7, 9,

adjacent_difference は入力の要素数と同じ要素数だけ出力する。もし先頭要素がいらなければ range.begin() を捨てればいいだけのこと。