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

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

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

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


person Baklap4    schedule 05.02.2014    source источник
comment
Вы можете использовать 1D std :: vector и сохранить количество столбцов. См .: stackoverflow.com/questions/20226270/   -  person    schedule 05.02.2014
comment
Вместо этого используйте vector<vector<int>>, поскольку вы используете C ++.   -  person herohuyongtao    schedule 05.02.2014
comment
вероятно, вы можете сохранить их как member из class   -  person Sakthi Kumar    schedule 05.02.2014
comment
Мы должны использовать массив вместо векторов. D: Я знаю, что это возможно с векторами ..   -  person Baklap4    schedule 05.02.2014
comment
@SakthiKumar как сказал .. я тоже не хотел их хранить   -  person Baklap4    schedule 05.02.2014
comment
@ Baklap4 Вы должны где-то хранить эту динамическую информацию.   -  person    schedule 05.02.2014


Ответы (4)


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

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

person killogre    schedule 05.02.2014

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

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

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

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

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

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

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


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

person herohuyongtao    schedule 05.02.2014

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

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

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

person Jarod42    schedule 05.02.2014