C++11: Эффективно перебирать матрицу с одним циклом диапазона?

(Для конкретного контекста компилятора/платформы возьмите GCC 4.7 и Ubuntu 12.04 на x86_64)

Учитывая некоторую функцию f:

void f(int x, int y);

int nx = ...;
int ny = ...;

Один способ перебора для каждого значения (x,y) от (0,0) до (nx,ny):

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.

Можно ли написать g так, чтобы Q2 был столь же эффективен, как Q1? Если да, то как? Если нет, то что самое близкое, что мы можем получить?

Вы можете изменить auto на auto& или auto&&, если это поможет.

Вы также можете заменить it.x на it.x() и it.y на it.y(), если это поможет.

(Напомним, что расширение for на основе диапазона — это всего лишь тип итератора по вашему выбору: C++11: оператор for на основе диапазона: время жизни "range-init"?)

5
задан Community 23 May 2017 в 11:49
поделиться