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)
没有任何运行时成本?
这是我可以管理的最简单的实现:
#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!
| 归档时间: |
|
| 查看次数: |
361 次 |
| 最近记录: |