iteration.

飲み物だから太らない - 帯に短し襷に長し
配列を頭からとお尻から同時に辿りたい時の話。


0 origin の array[n - i - 1] は array[(n-1) - i] であるのに対し
1 origin の array[n - i + 1] は array[n - (i-1)] なのが面白いですよね。
あっちを立てればこっちが立たず。


無理やり実現しようとすると

last = n-1;
for (i = 0; i <= last; i++) {
  calc(array[i], array[last-i]);
}

とかになるんでしょうかね。



ここで、後ろから数えてi番目の要素の参照を返す演算子
operator![] なんかが定義できると

for (i = 0; i < n; i++) {
  calc(array[i], array![i]);
}

のように書けてうれしいかもしれない。
C++ だと rbegin/rend が似たような処理を提供するのだけれど

for (i = 0; i < n; i++) {
  calc(*(v.begin()+i), *(v.rbegin()+i));
}

とか

for (i = v.begin(), j = v.rbegin(); i != v.end(); ++i, ++j) {
  calc(*i, *j);
}

とかなって、あまり綺麗には書けないというか、C++ なコードになってしまう。


うーん、物悲しい…。