C++ 11:使用单范围循环有效地迭代矩阵?

And*_*zos 5 c++ gcc c++11

(对于具体的编译器/平台上下文,请在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"生命周期?)

K-b*_*llo 3

是否可以写出 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)