#include <cstdint>
#include <iostream>
#include <algorithm>
#include <vector>
template <typename T>
class Matrix
{
public:
Matrix(std::size_t rows, std::size_t columns);
Matrix(std::initializer_list<std::initializer_list<T>> init);
auto rows() const -> std::size_t;
auto columns() const -> std::size_t;
auto operator()(std::size_t i, std::size_t j) const -> const T&;
auto operator()(std::size_t i, std::size_t j) -> T&;
private:
const std::size_t rows_;
const std::size_t columns_;
std::vector<T> elements_;
};
template <typename T>
Matrix<T>::Matrix(std::size_t rows, std::size_t columns)
: rows_{ rows }, columns_{ columns }, elements_( rows * columns )
{
}
template <typename T>
Matrix<T>::Matrix(std::initializer_list<std::initializer_list<T>> init)
: Matrix{
init.size(),
std::max(
init,
[](const auto& a, const auto& b) {
return a.size() < b.size();
}
).size()
}
{
std::size_t i = 0;
for (const auto& row : init)
{
if (i >= rows())
break;
std::size_t j = 0;
for (const auto& value : row)
{
if (j >= columns())
break;
(*this)(i, j) = value;
++j;
}
++i;
}
}
template <typename T>
auto Matrix<T>::rows() const -> std::size_t
{
return rows_;
}
template <typename T>
auto Matrix<T>::columns() const -> std::size_t
{
return columns_;
}
template <typename T>
auto Matrix<T>::operator()(std::size_t i, std::size_t j) const -> const T&
{
return elements_[ i * columns() + j];
}
template <typename T>
auto Matrix<T>::operator()(std::size_t i, std::size_t j) -> T&
{
return elements_[ i * columns() + j];
}
template <typename T>
std::ostream& operator<<(std::ostream& out, const Matrix<T>& m)
{
out << typeid(T).name() << m.rows() << "x" << m.columns();
out << "{ ";
for (std::size_t i = 0; i < m.rows(); ++i)
{
if (i > 0)
out << ", ";
out << "{ ";
for (std::size_t j = 0; j < m.columns(); ++j)
{
if (j > 0)
out << ", ";
out << m(i, j);
}
out << " }";
}
out << " }";
return out;
}
auto main() -> int
{
Matrix<float> m
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
std::cout << m << std::endl;
}
I2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBNYXRyaXgKewogICAgcHVibGljOgogICAgICAgIE1hdHJpeChzdGQ6OnNpemVfdCByb3dzLCBzdGQ6OnNpemVfdCBjb2x1bW5zKTsKICAgICAgICBNYXRyaXgoc3RkOjppbml0aWFsaXplcl9saXN0PHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPj4gaW5pdCk7CiAgICAgICAgYXV0byByb3dzKCkgY29uc3QgLT4gc3RkOjpzaXplX3Q7CiAgICAgICAgYXV0byBjb2x1bW5zKCkgY29uc3QgLT4gc3RkOjpzaXplX3Q7CiAgICAgICAgYXV0byBvcGVyYXRvcigpKHN0ZDo6c2l6ZV90IGksIHN0ZDo6c2l6ZV90IGopIGNvbnN0IC0+IGNvbnN0IFQmOwogICAgICAgIGF1dG8gb3BlcmF0b3IoKShzdGQ6OnNpemVfdCBpLCBzdGQ6OnNpemVfdCBqKSAtPiBUJjsKICAgIHByaXZhdGU6CiAgICAgICAgY29uc3Qgc3RkOjpzaXplX3Qgcm93c187CiAgICAgICAgY29uc3Qgc3RkOjpzaXplX3QgY29sdW1uc187CiAgICAgICAgc3RkOjp2ZWN0b3I8VD4gZWxlbWVudHNfOwogICAgICAgIAp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ck1hdHJpeDxUPjo6TWF0cml4KHN0ZDo6c2l6ZV90IHJvd3MsIHN0ZDo6c2l6ZV90IGNvbHVtbnMpCjogcm93c197IHJvd3MgfSwgY29sdW1uc197IGNvbHVtbnMgfSwgZWxlbWVudHNfKCByb3dzICogY29sdW1ucyApCnsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ck1hdHJpeDxUPjo6TWF0cml4KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4+IGluaXQpCjogTWF0cml4eyAKICAgIGluaXQuc2l6ZSgpLAogICAgc3RkOjptYXgoCiAgICAgICAgaW5pdCwKICAgICAgICBbXShjb25zdCBhdXRvJiBhLCBjb25zdCBhdXRvJiBiKSB7CiAgICAgICAgICAgIHJldHVybiBhLnNpemUoKSA8IGIuc2l6ZSgpOwogICAgICAgIH0KICAgICkuc2l6ZSgpCiAgfQp7CiAgICBzdGQ6OnNpemVfdCBpID0gMDsKICAgIGZvciAoY29uc3QgYXV0byYgcm93IDogaW5pdCkKICAgIHsKICAgICAgICBpZiAoaSA+PSByb3dzKCkpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIHN0ZDo6c2l6ZV90IGogPSAwOwogICAgICAgIGZvciAoY29uc3QgYXV0byYgdmFsdWUgOiByb3cpCiAgICAgICAgewogICAgICAgICAgICBpZiAoaiA+PSBjb2x1bW5zKCkpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgKCp0aGlzKShpLCBqKSA9IHZhbHVlOwogICAgICAgICAgICArK2o7CiAgICAgICAgfQogICAgICAgICsraTsKICAgIH0gCn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgphdXRvIE1hdHJpeDxUPjo6cm93cygpIGNvbnN0IC0+IHN0ZDo6c2l6ZV90CnsKICAgIHJldHVybiByb3dzXzsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmF1dG8gTWF0cml4PFQ+Ojpjb2x1bW5zKCkgY29uc3QgLT4gc3RkOjpzaXplX3QKewogICAgcmV0dXJuIGNvbHVtbnNfOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KYXV0byBNYXRyaXg8VD46Om9wZXJhdG9yKCkoc3RkOjpzaXplX3QgaSwgc3RkOjpzaXplX3QgaikgY29uc3QgLT4gY29uc3QgVCYKewogICAgcmV0dXJuIGVsZW1lbnRzX1sgaSAqIGNvbHVtbnMoKSArIGpdOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KYXV0byBNYXRyaXg8VD46Om9wZXJhdG9yKCkoc3RkOjpzaXplX3QgaSwgc3RkOjpzaXplX3QgaikgLT4gVCYKewogICAgcmV0dXJuIGVsZW1lbnRzX1sgaSAqIGNvbHVtbnMoKSArIGpdOwp9CiAgICAgICAgCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IE1hdHJpeDxUPiYgbSkKewogICAgb3V0IDw8IHR5cGVpZChUKS5uYW1lKCkgPDwgbS5yb3dzKCkgPDwgIngiIDw8IG0uY29sdW1ucygpOwogICAgb3V0IDw8ICJ7ICI7CiAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbS5yb3dzKCk7ICsraSkKICAgIHsKICAgICAgICBpZiAoaSA+IDApCiAgICAgICAgICAgIG91dCA8PCAiLCAiOwogICAgICAgIG91dCA8PCAieyAiOwogICAgICAgIGZvciAoc3RkOjpzaXplX3QgaiA9IDA7IGogPCBtLmNvbHVtbnMoKTsgKytqKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGogPiAwKQogICAgICAgICAgICAgICAgb3V0IDw8ICIsICI7CiAgICAgICAgICAgIG91dCA8PCBtKGksIGopOwogICAgICAgIH0KICAgICAgICBvdXQgPDwgIiB9IjsKICAgIH0KICAgIG91dCA8PCAiIH0iOwogICAgcmV0dXJuIG91dDsKfQoKYXV0byBtYWluKCkgLT4gaW50CnsKICAgIE1hdHJpeDxmbG9hdD4gbQogICAgewogICAgICAgIHsgMSwgMiwgMyB9LAogICAgICAgIHsgNCwgNSwgNiB9LAogICAgICAgIHsgNywgOCwgOSB9CiAgICB9OwogICAgCiAgICBzdGQ6OmNvdXQgPDwgbSA8PCBzdGQ6OmVuZGw7Cn0=