Как получить строки и столбцы из 2d массива c ++

0

Я создал 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()

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

Как это сделать без объявления глобальных переменных для строк и столбцов?

  • 0
    Вы можете использовать 1D std :: vector и хранить количество столбцов. См .: stackoverflow.com/questions/20226270/…
  • 0
    Вместо этого используйте vector<vector<int>> так как вы используете C ++.
Показать ещё 4 комментария
Теги:
arrays
multidimensional-array
row
sizeof

4 ответа

1
Лучший ответ

Прежде всего, выделение 2D-массива явно так, как это, не является хорошей идеей с точки зрения производительности, поскольку память не является непрерывной. Лучше выделить его в один кусок памяти (если он не слишком большой) и абстрагировать 2D-доступ, как это делают большинство библиотек обработки изображений (например, OpenCV).

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

0

Следующее может помочь:

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;
};

Информация о размере хранится в самом экземпляре.

0

После создания 2D-массива таким образом, places фактически является указатель, указывающий на первую строку его содержимого.

Указатели не сохраняют метаданные, чтобы указать размер области, на которую они указывают; если все, что у вас есть, есть указатель, то нет (переносного) способа получить количество строк или столбцов в массиве.

Вам нужно будет передать эту информацию вместе с указателем, или вам нужно будет использовать значение контрольной суммы в самом массиве (подобно тому, как строки C используют терминатор 0, хотя это дает только логический размер строки, что может быть меньше физического размера массива, который он занимает).

Как получить размер 2D-массива, на который указывает двойной указатель? для получения дополнительной информации.


Изменить: я рекомендую вам использовать vector<vector<int>> вместо этого, поскольку вы используете C++.

0

похоже, что у вас есть объект "Board", поэтому храните "место" и информацию о его размере в этот класс/структуру

и создайте функцию sizeof(), которая возвращает std :: pair как:

  std::pair<unsigned int, unsigned int> sizeof(const Board& b)
  { return make_pair(b.row(), b.col());}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню