まあ、@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 );
ただし、この機能が必要な場所ならどこでも再利用できます。