#include <iostream>
#include <cstring>
#include <sstream>
using namespace std;
template<typename T>
class Array {
public:
Array(int rs, int cs)
:rows( rs ), cols( cs )
{
const int Length = rows * cols;
v = new T[ Length ];
memset( v, 0, Length * sizeof( T ) );
}
~Array()
{
delete[] v;
}
T &cell(int row, int col)
{
return v[ ( row * cols ) + col ];
}
void setRow(int r, T * data)
{
memcpy( v + ( cols * r ), data, cols * sizeof( T ) );
}
string toString()
{
const int Length = rows * cols;
ostringstream cnvt;
for(int i = 0; i < Length; ++i) {
cnvt << v[ i ];
if ( ( i + 1 ) % cols == 0 ) {
cnvt << '\n';
}
}
return cnvt.str();
}
private:
T * v;
int rows;
int cols;
};
int main() {
int data[][4] = {{2,1,2,1},
{1,2,2,2},
{1,1,1,1},
{2,1,1,2}};
Array<int> array( 4, 4 );
array.setRow( 0, data[ 0 ] );
array.setRow( 1, data[ 1 ] );
array.setRow( 2, data[ 2 ] );
array.setRow( 3, data[ 3 ] );
cout << array.toString() << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPHNzdHJlYW0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjbGFzcyBBcnJheSB7CnB1YmxpYzoKICAgIEFycmF5KGludCBycywgaW50IGNzKQogICAgICAgICA6cm93cyggcnMgKSwgY29scyggY3MgKQogICAgewogICAgICAgIGNvbnN0IGludCBMZW5ndGggPSByb3dzICogY29sczsKCiAgICAgICAgdiA9IG5ldyBUWyBMZW5ndGggXTsKICAgICAgICBtZW1zZXQoIHYsIDAsIExlbmd0aCAqIHNpemVvZiggVCApICk7CiAgICB9CgogICAgfkFycmF5KCkKICAgIHsKICAgICAgIGRlbGV0ZVtdIHY7CiAgICB9CgogICAgVCAmY2VsbChpbnQgcm93LCBpbnQgY29sKQogICAgewogICAgICAgIHJldHVybiB2WyAoIHJvdyAqIGNvbHMgKSArIGNvbCBdOwogICAgfQogICAgCiAgICB2b2lkIHNldFJvdyhpbnQgciwgVCAqIGRhdGEpCiAgICB7CiAgICAJbWVtY3B5KCB2ICsgKCBjb2xzICogciApLCBkYXRhLCBjb2xzICogc2l6ZW9mKCBUICkgKTsKICAgIH0KICAgIAogICAgc3RyaW5nIHRvU3RyaW5nKCkKCXsKCQljb25zdCBpbnQgTGVuZ3RoID0gcm93cyAqIGNvbHM7CgkJb3N0cmluZ3N0cmVhbSBjbnZ0OwoJCQoJCWZvcihpbnQgaSA9IDA7IGkgPCBMZW5ndGg7ICsraSkgewoJCQljbnZ0IDw8IHZbIGkgXTsKCQkJaWYgKCAoIGkgKyAxICkgJSBjb2xzID09IDAgKSB7CgkJCQljbnZ0IDw8ICdcbic7CgkJCX0KCQl9CgkJCgkJcmV0dXJuIGNudnQuc3RyKCk7Cgl9ICAgIAoKcHJpdmF0ZToKICAgIFQgKiB2OwogICAgaW50IHJvd3M7CiAgICBpbnQgY29sczsKfTsKCmludCBtYWluKCkgewoJaW50IGRhdGFbXVs0XSA9IHt7MiwxLDIsMX0sCgkJCQl7MSwyLDIsMn0sCgkJCQl7MSwxLDEsMX0sCgkJCQl7MiwxLDEsMn19OwoJQXJyYXk8aW50PiBhcnJheSggNCwgNCApOwoJCglhcnJheS5zZXRSb3coIDAsIGRhdGFbIDAgXSApOwoJYXJyYXkuc2V0Um93KCAxLCBkYXRhWyAxIF0gKTsKCWFycmF5LnNldFJvdyggMiwgZGF0YVsgMiBdICk7CglhcnJheS5zZXRSb3coIDMsIGRhdGFbIDMgXSApOwoJCgljb3V0IDw8IGFycmF5LnRvU3RyaW5nKCkgPDwgZW5kbDsKCXJldHVybiAwOwp9Cg==