A vector
из vector
s не является смежным. Каждый вектор, и у вас есть 12 из них, не включая vector
, соединяющие 12, содержит свой собственный блок динамически выделяемой памяти. &pages[0][0][0]
дает адрес первого столбца первой строки первой страницы. Кром знает только, где в памяти находится второй столбец первого ряда первой страницы, но вероятность того, что он будет сразу после первого, удивительно мала. Это почти наверняка нарушение доступа.
С подходом vector
из vector
s лучшее, на что вы можете надеяться, это что-то вроде:
vsPage pages;
for (const auto & row : Array)
{
vsRows r;
for (const auto & col : row)
{
r.emplace_back(std::begin(col), std::end(col));
}
pages.emplace_back(r);
}
Вы действительно можете только копироватьпо одному столбцу за раз.
Так что, вероятно, пришло время выбросить vector
из vector
s и сделать vector
LOOK похожим на многомерный vector
. Это хороший 2-D дизайн , который вы сможете разбить на 3 измерения. Как только все данные будут смежными, вы можете обмануть, как ад и std::copy
все данные так, как пытался просящий. Я бы попытался скрыть это за пределами класса в 3-D классе, чтобы вы могли изменить его позже, не мешая никому.
Пример:
// Basic framework gleefully looted from jamesdlin
class ThreeDee
{
public:
// zero initialized "empty" 3D matrix
ThreeDee(size_t pages, size_t rows, size_t cols) :
mPages(pages), mRows(rows), mCols(cols), mData(pages * rows * cols)
{
}
// array initialized "empty" 3D matrix
// the template params are deduced from the parameters of the array
// but to get an array rather than a decayed pointer, we need to pass the array
// by reference
template<size_t PAGES, size_t ROWS, size_t COLS>
ThreeDee(string (&arr)[PAGES][ROWS][COLS]) :
mPages(PAGES), mRows(ROWS), mCols(COLS), mData(PAGES * ROWS * COLS)
{
// I hate this, but I don't have anything better yet and I have to
// surrender the computer to a student with homework
std::copy(&arr[0][0][0], &arr[0][0][0]+mData.size(), mData.data());
}
string& operator()(size_t page, size_t row, size_t col)
{
return mData[(page * mRows + row) * mCols + col]; // 3D to 1D mapping
}
string operator()(size_t page, size_t row, size_t col) const
{
return mData[(page * mRows + row) * mCols + col];
}
size_t pages()const
{
return mPages;
}
size_t rows()const
{
return mRows;
}
size_t cols()const
{
return mCols;
}
private:
size_t mPages;
size_t mRows;
size_t mCols;
std::vector<string> mData;
};
Это делает использованиепросто:
string Array[2][3][2];
ThreeDee pages(Array);