Это хороший способ найти длину динамически распределенного массива? - PullRequest
0 голосов
/ 30 ноября 2011

У меня есть класс Matrix, и я хочу передать массив конструктору для динамической установки значений матрицы.Я обнаружил, что если я выделю массив следующим образом:

double **array;
array = new double*[3];
array[0] = new double[2];
array[1] = new double[2];
array[2] = new double[2];
array[0][0] = 1;
array[0][1] = 1;
array[1][0] = 1;
array[1][1] = 1;
array[2][0] = 1;
array[2][1] = 1;

, я могу получить количество строк и столбцов, используя метод, подобный следующему:

int getNRows(double **data){
  int size = 0;
  while(*(data+size)){size++;}
  return size;
}

int getNCols(double **data){
  int size = 0;
  while(**(data+size)){size++;}
  return size;
}

Это нормально, или я долженпридерживаться векторного объявления?

Ответы [ 4 ]

5 голосов
/ 30 ноября 2011

Вы полагаетесь на неопределенное поведение;нет никакой гарантии, что произойдет, когда вы превысите границы массива.Это не будет работать вообще.

Используйте std::vector или другой класс контейнера.

4 голосов
/ 30 ноября 2011

Ваше предположение совершенно неверно; Вы не можете получить размер любым способом, близким к тому, что вы предлагаете. Это совершенно неопределенное и опасное поведение.


Вот псевдо-правило (т. Е. Оно не соответствует действительности, но если вы не понимаете, почему оно не соответствует действительности, оно относится к вам):

Не используйте указатели. Не используйте new и delete. (И не говорите using namespace std;.)


Единственный способ, которым вы должны это делать, - это контейнеры C ++.

Вектор векторов будет первым кадром, хотя плоский вектор, к которому можно получить доступ с шагом, может быть лучше, а Boost.multi_array может быть даже лучшим:

  • std::vector< std::vector<double> > v (3, std::vector<double>(2));

  • std::array<std::array<double, 2>, 3>

  • std::vector<double> v(6); и использовать v[i + 2 *j] и т. Д.

  • Boost.MultiArray

2 голосов
/ 30 ноября 2011

Что происходит, когда вы сохраняете значение 0 в своем массиве? Вам необходимо сохранить и передать размеры функциям, которые работают с вашей структурой данных, или использовать контейнер STL, например std::vector.

Пожалуйста, получите копию Effective STL .

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

2 голосов
/ 30 ноября 2011

Если это работает, это просто удача.Вы не знаете, что находится за пределами памяти, выделенной для матрицы, и особенно если она пуста.

Придерживайтесь чего-то вроде:

std::vector<std::vector<double>> matrix;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...