経度のように周期的なデータが長さn
配列xに格納されているとする。添字が0から始まるとして,x[n]
はx[0]
,x[-1]
はx[n-1]
の値を返すようにしたい。[]
の定義は後回しにして,今回は関数を書いてみる。
C++でtemplate
を使っておけば,特定の型に依存しないようにするジェネリックプログラミングだと思っていた。しかしC由来の普通の配列には使えない。そもそもコンテナを渡したり,返したりすると,一般性や効率が損なわれるのでご法度とのこと。
反復子を渡すようにして,負でもコンテナのサイズより大きくても良い添字i
での値を返すジェネリックな関数を書いてみた。
https://gist.github.com/tenomoto/79f5fb60783d24dcb8bf7910da4052c6
ある値以上になる添字を返す関数は,次のように書いたらよさそうだ。
https://gist.github.com/tenomoto/17ff04f4a1445302bb19a439c8c2546b
反復子として,ベクトルはx.cbegin()
とx.cend()
があるが,valarray
にはないのでstd::begin(x)
とstd::end(x)
を使う。配列はポインタ演算x
とx + n
(n
は配列の長さ)でよい。