Как преобразовать массив vector в матрицу vector>?

У меня есть цикл, преобразующий квадратную матрицу в плоский (одномерный) массив:

int n = 5; //для примера
vector<vector<int>> p1(n,vector<int>(n)); //наша матрица
// забиваем матрицу значениями

vector<int> p1_flat; //наш плоский массив
p1_flat.reserve(n * n);

for (auto const &row : p1)
    copy(row.begin(), row.end(), back_inserter(p1_flat));

А как сделать наоборот?
Приветствуется хороший вариант с точки зрения производительности, потому что работаю с матрицами большого размера.


Ответы (2 шт):

Автор решения: e.n.shirokov

так

for(int i = 0, row = 0; i < p1_flat.size(); i += n, row++) {
    copy_n(p1_flat.begin() + i, n, p1[row].begin());
}
→ Ссылка
Автор решения: Harry
int main(int argc, const char * argv[])
{
    int n = 5;
    vector<int> p1_flat;
    for(int i = 0; i < n*n; ++i) p1_flat.push_back(i);

    vector<vector<int>> p1(n,vector<int>(n));

    for(int i = 0; i < n; ++i)
        copy_n(p1_flat.begin()+i*n,n,p1[i].begin());

    for(auto a: p1)
    {
        for(auto b: a) cout << setw(2) << b << " ";
        cout << endl;
    }
}

https://ideone.com/lih4aN

→ Ссылка