(具体的なコンパイラ/プラットフォーム コンテキストについては、x86_64 で GCC 4.7 と Ubuntu 12.04 を使用します)
ある関数 f が与えられた場合:
void f(int x, int y);
int nx = ...;
int ny = ...;
(0,0) から (nx,ny) までのすべての値 (x,y) を反復する 1 つの方法は次のとおりです。
for (int x = 0; x < nx; x++)
for (int y = 0; y < ny; y++)
f(x,y);
これをコンパイルして、生成されたコード Q1 にします。
次のような関数 g を書きます。
for (auto it : g(Z))
f(it.x, it.y);
コード Q2 にコンパイルされます。
Q2がQ1と同じくらい効率的であるようにgを書くことは可能ですか? はいの場合、どのように?そうでない場合、私たちが得ることができる最も近いものは何ですか?
役立つ場合は、 auto を auto& または auto&& に変更できます。
it.x を it.x() に変更したり、it.y を it.y() に変更したりすることもできます。
(範囲ベースの for の展開は、選択したイテレータのような型であることを思い出してください: C++11: 範囲ベースの for ステートメント: "range-init"lifetime? )