Vederi Multidimensionale Contigue peste Memorie cu std::mdspan în C++23 în C++

Ghid complet pentru std::mdspan în C++23: reprezentarea eficientă a tensorilor și matricilor multidimensionale 2D/3D peste un simplu buffer de memorie contiguu, cu suport pentru layout-uri personalizate (layout_right, layout_left).

Sintaxă
#include <mdspan> | std::mdspan m(buffer.data(), linii, coloane); m[i, j] = 10;

În calculul științific, procesarea de imagini și grafica 3D, matricile multidimensionale erau reprezentate anterior fie prin vectori de vectori ineficienți (std::vector<std::vector<int>> – ce fragmentau memoria pe heap și distrugeau cache-ul CPU), fie prin calcul manual greoi de indici (buffer[i * coloane + j]). std::mdspan adăugat în C++23 oferă o vedere multidimensională cu cost zero peste orice secvență contiguă de memorie, suportând sintaxa modernă de indexare multidimensională matrice[i, j, k].

Manipularea unei matrici 2D peste un buffer unidimensional
#include <mdspan>
#include <vector>
#include <print>

int main() {
    constexpr size_t LINII = 3;
    constexpr size_t COLOANE = 4;

    // Buffer contiguu de 12 elemente pe stivă/heap:
    std::vector<int> date(LINII * COLOANE, 0);

    // Creăm o vedere 2D (mdspan nu deține memoria, doar o mapează):
    std::mdspan matrice(date.data(), LINII, COLOANE);

    // Indexare curată cu operatorul [] din C++23:
    matrice[0, 0] = 100;
    matrice[1, 2] = 42;
    matrice[2, 3] = 999;

    std::println("Valoare la [1, 2]: {}", matrice[1, 2]);

    // Afișarea întregii matrici:
    for (size_t i = 0; i < matrice.extent(0); ++i) {
        for (size_t j = 0; j < matrice.extent(1); ++j) {
            std::print("{:>4} ", matrice[i, j]);
        }
        std::println("");
    }
    return 0;
}