(对于具体的编译器/平台上下文,请在x86_64上使用GCC 4.7和Ubuntu 12.04)
给定一些函数f:
void f(int x, int y);
int nx = ...;
int ny = ...;
Run Code Online (Sandbox Code Playgroud)
迭代从(0,0)到(nx,ny)的每个值(x,y)的一种方法是:
for (int x = 0; x < nx; x++)
for (int y = 0; y < ny; y++)
f(x,y);
Run Code Online (Sandbox Code Playgroud)
让这个编译成一些生成的代码Q1.
我们将编写一个函数g,使得:
for (auto it : g(Z))
f(it.x, it.y);
Run Code Online (Sandbox Code Playgroud)
编译成代码Q2.
有可能写出这样的Q2,Q2和Q1一样有效吗?如果有,怎么样?如果没有,我们能得到的最接近的是什么?
如果有帮助,您可以将auto更改为auto&或auto &&.
您也可以将it.x更改为it.x(),并将it.y更改为it.y(),如果有帮助的话.
(回想一下,基于范围的扩展只是你选择的迭代器类型:C++ 11:基于范围的for语句:"range-init"生命周期?)
是否可以写出 g 使得 Q2 与 Q1 一样有效?如果是,怎么办?如果不是,我们能得到的最接近的是什么?
当然这是可能的,您只需要定义以与循环相同的方式递增的迭代器for。从我的头顶上看:
class matrix_iterator
{
public:
...
matrix_iterator& operator++()
{
if( ++y >= ny )
{
++x;
y = 0;
}
return *this;
}
private:
int nx, ny;
int x, y;
};
Run Code Online (Sandbox Code Playgroud)