#include <vector>
template <typename T>
class matrix
{
std::size_t mRowdim, mColdim;
std::vector<T> mValues;
public:
matrix(std::size_t rowdim, std::size_t coldim)
: mRowdim(rowdim), mColdim(coldim), mValues(rowdim*coldim) {} // rowdim x coldim matrix
matrix(const matrix& other)
: mRowdim(other.mRowdim), mColdim(other.mColdim), mValues(other.mValues) {} // copy ctor
matrix(matrix&& other)
: mRowdim(other.mRowdim), mColdim(other.mColdim), mValues(std::move(other.mValues)) {} // move ctor
matrix &operator= (const matrix &other) // copy operator
{
matrix other_cpy(other);
other_cpy.swap(*this);
return *this;
}
matrix &operator= (matrix &&other) // move operator
{
other.swap(*this);
return *this;
}
void swap(matrix &other) // swaperator
{
std::swap(mRowdim, other.mRowdim);
std::swap(mColdim, other.mColdim);
mValues.swap(other.mValues);
}
T &operator() (std::size_t row, std::size_t col)
{
return mValues[mColdim*row + col];
}
const T &operator() (std::size_t row, std::size_t col) const
{
// ... range check ...
return mValues[mColdim*row + col];
}
};
int main()
{
matrix<double> my_matrix(10,10);
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBtYXRyaXggCnsKICBzdGQ6OnNpemVfdCAgICBtUm93ZGltLCBtQ29sZGltOwogIHN0ZDo6dmVjdG9yPFQ+IG1WYWx1ZXM7CgpwdWJsaWM6CiAgbWF0cml4KHN0ZDo6c2l6ZV90IHJvd2RpbSwgc3RkOjpzaXplX3QgY29sZGltKSAKICAgIDogbVJvd2RpbShyb3dkaW0pLCBtQ29sZGltKGNvbGRpbSksIG1WYWx1ZXMocm93ZGltKmNvbGRpbSkge30gLy8gcm93ZGltIHggY29sZGltIG1hdHJpeCAKCiAgbWF0cml4KGNvbnN0IG1hdHJpeCYgb3RoZXIpIAogICAgOiBtUm93ZGltKG90aGVyLm1Sb3dkaW0pLCBtQ29sZGltKG90aGVyLm1Db2xkaW0pLCBtVmFsdWVzKG90aGVyLm1WYWx1ZXMpIHt9IC8vIGNvcHkgY3RvcgoKICBtYXRyaXgobWF0cml4JiYgb3RoZXIpIAogICAgOiBtUm93ZGltKG90aGVyLm1Sb3dkaW0pLCBtQ29sZGltKG90aGVyLm1Db2xkaW0pLCBtVmFsdWVzKHN0ZDo6bW92ZShvdGhlci5tVmFsdWVzKSkge30gLy8gbW92ZSBjdG9yCgogIG1hdHJpeCAmb3BlcmF0b3I9IChjb25zdCBtYXRyaXggJm90aGVyKSAvLyBjb3B5IG9wZXJhdG9yCiAgewogICAgbWF0cml4IG90aGVyX2NweShvdGhlcik7CiAgICBvdGhlcl9jcHkuc3dhcCgqdGhpcyk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBtYXRyaXggJm9wZXJhdG9yPSAobWF0cml4ICYmb3RoZXIpIC8vIG1vdmUgb3BlcmF0b3IKICB7CiAgICAgb3RoZXIuc3dhcCgqdGhpcyk7CiAgICAgcmV0dXJuICp0aGlzOwogIH0KIAogIHZvaWQgc3dhcChtYXRyaXggJm90aGVyKSAvLyBzd2FwZXJhdG9yCiAgeyAKICAgIHN0ZDo6c3dhcChtUm93ZGltLCBvdGhlci5tUm93ZGltKTsKICAgIHN0ZDo6c3dhcChtQ29sZGltLCBvdGhlci5tQ29sZGltKTsKICAgIG1WYWx1ZXMuc3dhcChvdGhlci5tVmFsdWVzKTsgCiAgfQoKICBUICZvcGVyYXRvcigpIChzdGQ6OnNpemVfdCByb3csIHN0ZDo6c2l6ZV90IGNvbCkKICB7CiAgICByZXR1cm4gbVZhbHVlc1ttQ29sZGltKnJvdyArIGNvbF07CiAgfSAKCiAgY29uc3QgVCAmb3BlcmF0b3IoKSAoc3RkOjpzaXplX3Qgcm93LCBzdGQ6OnNpemVfdCBjb2wpIGNvbnN0CiAgeyAKICAgIC8vIC4uLiByYW5nZSBjaGVjayAuLi4KICAgIHJldHVybiBtVmFsdWVzW21Db2xkaW0qcm93ICsgY29sXTsKICB9IAp9OwoKaW50IG1haW4oKQp7CiAgbWF0cml4PGRvdWJsZT4gbXlfbWF0cml4KDEwLDEwKTsKCiAgcmV0dXJuIDA7Cn0=