好吧,@bitmask 的回答已经说出了我在阅读问题时想说的大部分内容。
但为了完整起见,这里有另一种技术:
Matrix m;
Index2D< 9, 9 > pos;
for( ; pos < pos.end(); ++pos )
{
if( m( pos.x(), pos.y() ) == 0 )
{
break;
}
}
cout << pos.x() << " " << pos.y() << endl;
恕我直言,这是更清晰的代码。
此外,然后可以使矩阵支持通过Index2D
值进行索引,从而将上述内容简化为……
Matrix m;
Index2D< 9, 9 > pos;
for( ; pos < pos.end(); ++pos )
{
if( m[pos] == 0 )
{
break;
}
}
cout << pos.x() << " " << pos.y() << endl;
由于Index2D
标准库中没有任何东西,因此需要在某个地方定义它,例如
template< int width, int height >
struct Index2D
{
int i_;
int x() const { return i_ % width; }
int y() const { return i_ / width; }
void operator++() { ++i_; }
bool operator<( Index2D const& other ) const
{
return (i_ < other.i_);
}
Index2D(): i_( 0 ) {}
Index2D( int const x, int const y )
: i_( width*y + x )
{}
static const Index2D endValue;
static Index2D end() { return endValue; }
};
template< int width, int height >
Index2D< width, height > const Index2D< width, height >::endValue( 0, height );
但是,它可以在您需要此功能的任何地方重复使用。