Добро пожаловать в SO.
Если все, что у вас есть, это две альтернативы, то первая может быть лучше.
Предпочитают использовать массив или вектор STL вместо Cмассив
Вам следует избегать использования простых массивов C ++, поскольку вам нужно самим управлять выделением / освобождением памяти с помощью new/delete
и другим стандартным кодом, таким как отслеживать размер / проверять границы.Четко говоря, «Массивы C менее безопасны и не имеют преимуществ перед массивом и вектором».
Однако в первом варианте есть некоторые важные недостатки.Я хотел бы отметить следующее:
std::vector<std::vector<std::vector<T>>>
не является трехмерной матрицей.В матрице все строки должны иметь одинаковый размер.С другой стороны, в «векторе векторов» нет гарантии, что все вложенные векторы имеют одинаковую длину.Причина в том, что вектор является линейной 1-D структурой, как указано в ответе @spectras.Следовательно, чтобы избежать всякого плохого или неожиданного поведения, вы должны включить в свой код охранники, чтобы получить гарантированный прямоугольный инвариант.
К счастью, первая альтернатива - не единственная, которую вы можете иметь в руках.
Например, вы можете заменить массив в стиле c на std :: array:
const int n = i_size * j_size * k_size;
std::array<int, n> myFlattenMatrix;
или использовать std::vector
в случае, если размеры вашей матрицы могут измениться.
Доступ к элементу по его 3 координатам
Относительно вашего вопроса
Чтобы легко получить доступ к определенному местоположению (i, j, k), перегрузка операторанеобходимо (я прав?).
Не совсем так.Поскольку нет ни 3-параметрического оператора ни для std :: vector, ни для массива, вы не можете его перегрузить.Но вы можете создать шаблонный класс или функцию, чтобы обернуть его для вас.В любом случае вы должны отложить 3 вектора или вычислить индекс сглаживания элемента в линейном хранилище.
Учитывая, что для экспериментов не используйте библиотеку матриц третьей части, такую как Eigen,
Вы пишете не для производства, а для исследовательских целей.В частности, ваше исследование касается производительности алгоритмов.В этом случае я предпочитаю не рекомендовать использовать стороннюю библиотеку, как Eigen, абсолютно.Конечно, многое зависит от того, какую метрику «скорости алгоритма» вы желаете собрать, но Эйген, например, многое сделает под капотом (например, векторизация ), что будетиметь огромное влияние на ваши эксперименты.Поскольку вам будет трудно контролировать эти невидимые оптимизации, функции библиотеки могут привести вас к неверным выводам о ваших алгоритмах.
Производительность алгоритма и биг-о нотация
Обычно производительность алгоритмов анализируется с использованием подхода big-O , где такие факторы, какфактическое затраченное время, аппаратная скорость или особенности языка программирования не учитываются.Книга Адама Дроздека «Структуры данных и алгоритмы в C ++» может предоставить более подробную информацию об этом.