Я создал 2D-массив в C++ следующим образом:
Board::Board(int rows, int cols){
places = new int*[rows];
for (int row = 0; row < rows; row++){
places[row] = new int[cols];
for (int col = 0; col < cols; col++){
places[row][col] = 0;
}
}
}
И это работает очень хорошо. Но теперь я хочу создать функцию, которая требует длины строк и столбцов массива. Я немного пробовал эту функцию:
sizeof()
Но я только получил его работу с нормальным массивом, чтобы вернуть длину.
Как это сделать без объявления глобальных переменных для строк и столбцов?
Прежде всего, выделение 2D-массива явно так, как это, не является хорошей идеей с точки зрения производительности, поскольку память не является непрерывной. Лучше выделить его в один кусок памяти (если он не слишком большой) и абстрагировать 2D-доступ, как это делают большинство библиотек обработки изображений (например, OpenCV).
Тем не менее, вы должны обернуть это в класс, который знает размер распределений, а затем сообщить размер с помощью общедоступных методов.
Следующее может помочь:
class Board
{
public:
Board(int rows, int cols) : rowCount(rows), columnCount(cols) {
places = new int*[rows];
for (int row = 0; row < rows; row++){
places[row] = new int[cols];
for (int col = 0; col < cols; col++){
places[row][col] = 0;
}
}
}
private:
int** places;
int rowCount;
int columnCount;
};
Информация о размере хранится в самом экземпляре.
После создания 2D-массива таким образом, places
фактически является указатель, указывающий на первую строку его содержимого.
Указатели не сохраняют метаданные, чтобы указать размер области, на которую они указывают; если все, что у вас есть, есть указатель, то нет (переносного) способа получить количество строк или столбцов в массиве.
Вам нужно будет передать эту информацию вместе с указателем, или вам нужно будет использовать значение контрольной суммы в самом массиве (подобно тому, как строки C используют терминатор 0, хотя это дает только логический размер строки, что может быть меньше физического размера массива, который он занимает).
Как получить размер 2D-массива, на который указывает двойной указатель? для получения дополнительной информации.
Изменить: я рекомендую вам использовать vector<vector<int>>
вместо этого, поскольку вы используете C++.
похоже, что у вас есть объект "Board", поэтому храните "место" и информацию о его размере в этот класс/структуру
и создайте функцию sizeof(), которая возвращает std :: pair как:
std::pair<unsigned int, unsigned int> sizeof(const Board& b)
{ return make_pair(b.row(), b.col());}
vector<vector<int>>
так как вы используете C ++.