用基于范围的for循环替换多维for循环

phi*_*sky 6 c++ for-loop c++11

我有一个Vec3课程.更换循环的最佳方法是什么?

for (int x = 20; x < 25; x++)
    for (int y = 40; y < 45; y++)
        for (int z = 2; z < 4; z++) doStuff({x,y,z});
Run Code Online (Sandbox Code Playgroud)

用这样的东西:

for(Vec3 v: Vec3range({20,40,2}, {25,45,4}))
    doStuff(v);
Run Code Online (Sandbox Code Playgroud)

没有任何运行时成本?

Nim*_*Nim 1

这是我可以管理的最简单的实现:

#include <iostream>
#include <tuple>

using namespace std;

using tuple_3d = tuple<int, int, int>;

struct range_3d;

struct range_3d_iterator
{
  const range_3d& c;
  tuple_3d i;

  bool operator!=(const range_3d_iterator& other)
  { return get<0>(i) != get<0>(other.i) && get<1>(i) != get<1>(other.i) && get<2>(i) != get<2>(other.i); }

  tuple_3d operator*() const
  { return make_tuple(get<0>(i), get<1>(i), get<2>(i)); }

  const range_3d_iterator& operator++();
};

struct range_3d
{
  tuple_3d s;
  tuple_3d e;

  range_3d_iterator begin() const
  { return { *this, s }; }

  range_3d_iterator end() const
  { return { *this, e }; }
};

const range_3d_iterator& range_3d_iterator::operator++()
{
  ++get<2>(i);
  if (get<2>(i) == get<2>(c.e))
  {
    get<2>(i) = get<2>(c.s);
    ++get<1>(i);
    if (get<1>(i) == get<1>(c.e))
    {
      get<1>(i) = get<1>(c.s);
      ++get<0>(i);
    }
  }
  return *this;
}

int main(void)
{
  for (auto&& v : range_3d{ make_tuple(20, 40, 2), make_tuple(25, 45, 4) })
    cout << get<0>(v) << ' ' << get<1>(v) << ' ' << get<2>(v) << endl;  
}
Run Code Online (Sandbox Code Playgroud)

命名有点糟糕,但除此之外,概念很简单。这range_3d是一个简单的类,它支持begin(),end()以获得循环工作的范围,然后“智能”就在range_3d_iterator它将迭代元组中。鉴于我在这里使用元组的方式,扩展到任意维度是微不足道的......

TBH,原来的 for 循环非常清楚...... IMO!