Матрица как вектор векторов

369
26 февраля 2017, 08:49

Вот тут - http://ru.stackoverflow.com/a/629964/228791 - в ответе использован тип трехмерной матрицы как вектора векторов векторов...

using vector3d = vector<vector<vector<int>>>;

Вообще-то более-менее понятно, но вопрос такой - ведь каждый вектор, например, в двумерной матрице, можно сделать своего размера? Если мы объявляем массив

double array[n][m];

то тут хоть в лепешку расшибись, но в каждой строке будет одинаковое число столбцов. А с векторами можно вектор удлиннить, скажем...

Вопрос такой - можно как-то средствами самого языка сделать так, чтоб матрица vector<vector<double>> имела фиксированные размеры? но при этом ее элементы можно было менять?

Под фиксированными размерами я имею в виду, чтоб все вектора внутри имели всегда один размер. Ну то есть есть у меня такая матрица NxM, я мог бы сделать, скажем, Nx2M, но чтоб не мог даже по ошибке как-то поменять у одних векторов размер на 2M, у других на 3. Я пока придумал только свой класс-оболочку написать, но нельзя ли как-то без этого?

Answer 1

Векторы - всего лишь динамические массивы. Представьте, что способ который вы ищете существует и вы его использовали.
Каким образом вы планируете добавить слой в вашу матрицу? Вам нужно пройтись циклом, и добавить нечто в каждый вектор. Посреди цикла ваша структура будет в неконсистентном состоянии.

Воспользуйтесь std::array:

array<array<array<int, l>, m>, n>

Или, по аналогии:

template <class T, size_t n, size_t m, size_t l>
using Matrix = array<array<array<int, l>, m>, n>;
Matrix<float, 3, 4, 5> matrix;

Вы можете сделать класс работы с такими матрицами, которые на любую мутацию возвращают новый экземпляр.

Answer 2

Если вам нужен многомерный массив с натурально неизменными размерами подмассивов, то можно реализовать его так, как реализуются встроенные массивы языка, т.е. через одномерный массив с пересчетом индексов

std::vector<double> v(n * m * l);

с последующим доступом к элементу [i][j][k] как

v[i * m * l + j * l + k] // [(i * m + j) * l + k]

Готового класса, инкапсулирующего такой пересчет индексов я вам не назову, но при желании вы можете реализовать его самостоятельно.

READ ALSO
Не могу назначить StandardGestures динамически

Не могу назначить StandardGestures динамически

В чем ошибка? не понимаю синтаксиса

325
Вызов методов класса через указатель на функцию

Вызов методов класса через указатель на функцию

Хочу реализовать возможность передавать в качестве аргумента функции указатель на метод разных классов

413
Вставка в unordered_map/set

Вставка в unordered_map/set

Если количество корзин в unordered map/set равно количеству элементов для вставки, гарантировано ли константное время вставки каждого элемента...

313
Процедура и событие mysql

Процедура и событие mysql

Создаю тестовые процедуру

278