Self-insert, ale uważam to za naprawdę dobry sposób https://dsp.krzaq.cc/post/98/prosty-widok-na-macierz-2d-w-cpp/
Pomysł jest taki, że używasz tablicy 1-d i masz na nią lekki widok, który odpowiada za odpowiednie się po niej poruszanie.
template<typename T>
class simple_2d_matrix_view
{
T* data_;
size_t width_;
size_t height_;
public:
simple_2d_matrix_view(T* ptr, size_t h, size_t w):
data_{ptr},
width_{w},
height_{h}
{}
size_t width() const { return width_; }
size_t height() const { return height_; }
T& operator()(size_t h, size_t w) {
assert(w < width_);
assert(h < height_);
return data_[width_ * h + w];
}
T const& operator()(size_t h, size_t w) const {
return const_cast<simple_2d_matrix_view&>(*this)(h, w);
}
};
użycie:
vector<double> data{1,2,3,4,5,6,7,8,9,10,11,12};
simple_2d_matrix_view<double> m(data.data(), 2, 6);
for(size_t i = 0; i < m.height(); ++i) {
for(size_t j = 0; j < m.width(); ++j) {
cout << m(i, j) << " ";
}
cout << "\n";
}