c ++ Объявление 2D-массива как глобальной переменной

Я изо всех сил пытаюсь выяснить, как объявить 2D-массив в качестве глобальной переменной, чтобы я мог использовать его во всех моих методах. До сих пор он объявлялся только в одном методе, поэтому его нельзя использовать в других методах. Я выяснил, как объявить обычный строковый массив, просто набрав строку * array = new string [1] в начале моего кода, прежде чем методы (затем я изменяю размер этого массива на основе переменной), но я не уверен, как это сделать с 2D-массивом:

void WordSearch::ReadSimplePuzzle()

int columns = 9;

int rows = 9;string **simple2DArray = new string*[columns];

for (int i = 0; i < columns; i++)

simple2DArray[i] = new string[rows];

//code that populates the array too long to post but not relevant.

Затем у меня есть метод, где мне нужно получить доступ к simple2DArray, но я не могу понять, как определить его в начале кода, любая помощь будет оценена.

-1

Решение

Я изо всех сил пытаюсь выяснить, как объявить 2D-массив в качестве глобального
переменная, поэтому я могу использовать его во всех моих методах.

Как и для любого глобального var, вам нужно объявить ваш указатель в глобальном пространстве:

string **simple2DArray;

и тогда вы можете назначить ему изнутри вашего метода

simple2DArray = new string*[columns];
0

Другие решения

Если ваши переменные столбцов и строк никогда не меняются, вы можете сделать это:

const int columns = 9;
const int rows = 9;

string simple2DArray[columns][rows];

Статически выделяя память, вам теперь не нужно беспокоиться об ее освобождении.


Поскольку вы пояснили, что размер неизвестен до времени выполнения, вы не сможете распределять память статически. Очень простое решение будет:

std::vector<std::vector<std::string>> simple2DArray; // This will have size 0 at start

Затем на шаге инициализации просто сделайте это:

simple2DArray.resize(rows);
for (auto& row : simple2DArray)
{
row.resize(columns);
}

Конечно, есть и другие способы сделать это, например, выделить всю память в одном блоке строк с размерами * столбцов, а затем выставить ее, как если бы это была двумерная матрица, но это может быть излишним для ваших целей.

1

Мое предложение — скрыть массив за функциональным интерфейсом.

std::string const& getElement(size_t m, size_t n);
void setElement(size_t m, size_t n, std::string const& val);

Вызывающие функции имеют абстракции 2D-массива, но им не нужно знать, как они представлены в коде.

В реализации у вас есть различные варианты:

  1. Используйте одномерный массив. Сопоставьте двумерные индексы с правильным индексом в одномерном массиве.
  2. Использовать std::vector, Еще нужно сопоставить индексы.
  3. Используйте 2D-массив. Не требуется отображение индексов.
  4. Использовать std::vector<std::vector<std::string>>, Не требуется отображение индексов.
1
По вопросам рекламы [email protected]