Работа с трёхмерным массивом

220
28 ноября 2017, 22:57

Как эффективнее создать алгоритм? Задаётся двумерный массив, скажем размером аб. и эти самые а и б уже никогда не изменятся больше. Создаю трёхмерный массив, у которого первый индекс бывает только 0. Над этим массивом проводятся некоторые вычисления, на их основе создаётся новый массив аб. На этом моменте мне нужно добавить ещё один массив размером аб, а первый индекс трёхмерного массива сможет быть 0 и 1, и так дальше, пока не будет найден "правильный" массив размером аб. сохранять предыдущие состояния нужно затем, что к ним часто придётся возвращаться. Выделяю память в начале через malloc, а дальше изменяю размер через realloc. Я так понимаю, что realloc на самом деле ищет место в памяти нужного размера, затем копирует предыдущий массив в новое место, а старую память очищает. В моём случае массив часто будет расти, а значит постоянно нужно будет тратить время на перенос данных из одного участка памяти в другой. Есть другой способ провернуть всё это, чтобы не перемещать данные? Угадать/вычислить заранее кол-во требуемой памяти невозможно даже примерно, максимальный первый индекс запросто может быть и только 0 и 100500, всё зависит от вводимых данных в первый массив а*б размера.

Answer 1

В комментарий код не воткнешь нормально...

Вот что предлагал я, если размеры 2d фиксированы:

#include <vector>
#include <array>
#include <iostream>
#include <iomanip>
using namespace std;
const int ROWS = 5, COLS = 8;
using Matrix = array<array<int,COLS>,ROWS>;
int main(int argc, const char * argv[])
{
    vector<Matrix> a(1);
    for(size_t r = 0; r < ROWS; ++r)
    {
        for(size_t c = 0; c < ROWS; ++c)
        {
            a[0][r][c] = r+c;
        }
    }
    //....
    Matrix b;
    for(size_t r = 0; r < ROWS; ++r)
    {
        for(size_t c = 0; c < ROWS; ++c)
        {
            b[r][c] = r*c;
        }
    }
    a.push_back(b);
}
Answer 2

Решил следующим образом создание массива 1,w,v:

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
    unsigned char w = 5, v = 4;
    vector<vector<vector<unsigned char>>> ar;
    ar.assign(1,vector<vector<unsigned char>>(w,vector<unsigned char>(v,0)));
    return 0;
}
READ ALSO
Проверка множеств на равенство

Проверка множеств на равенство

Как правильно проверить множества на равенство?

222
Отсутствует конструктор по умолчанию C++

Отсутствует конструктор по умолчанию C++

Здравствуйте! Я новичок в программированииНеобходимо реализовать операции сложения, вычитания и тп

632
Нужна помощь с двумерными массивами C++

Нужна помощь с двумерными массивами C++

Нужно организовать проверку элементов двумерного массива по диагонали с рандомных координат, по аналогии с ходом коня в шахматахВот часть...

199