Создание массива динамических размеров с массивами int фиксированного размера в C ++ - PullRequest
2 голосов
/ 16 декабря 2011

По какой-то причине это доставляет мне больше проблем, чем я думал ...

int *myArray[3];

myArray = new int[mySize];

не работает ...

Ранее я использовал typedef подобным образоми это сработало отлично, но на этот раз я не хочу создавать typedef

Ответы [ 3 ]

6 голосов
/ 16 декабря 2011

Может возникнуть соблазн сделать это:

::std::vector<int[3]> myArray;

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

Это будет так же эффективно, если у вас есть ::std::array (функция C ++ 11), и она действительно будет работать:

::std::vector< ::std::array<int, 3> > myArray;

Если вы можете сделать это, я очень рекомендую это. vector гораздо приятнее и безопаснее иметь дело, чем массив, который вы должны выделить себе с помощью new.

В противном случае попробуйте это:

typedef int inner_array_t[3];
inner_array_t *myArray = new inner_array_t[mySize];

И так как вы не хотите использовать typedef по какой-то странной причине, вы можете развернуть его так:

int (*myArray)[3] = new int[mySize][3];
6 голосов
/ 16 декабря 2011
int (*myArray)[3] = new int[mySize][3];

?

3 голосов
/ 16 декабря 2011
int *myArray[3];

Это означает, что "myArray должен быть массивом из трех указателей на int".

Вы, вероятно, хотели "myArray должен быть указателем на (массив из трех целых)". Это пишется int (*myArray)[3].

Подобные вещи намного проще с typedefs.

typedef int datum[3];
datum* myArray = new datum[mySize]; // no fuss, no muss.

А если серьезно, просто используйте std::vector. И создайте фактическую структуру для вашей группы из трех целых чисел. Или, если он действительно должен вести себя как массив, используйте boost::array, чтобы вы по крайней мере получили поведение типа первого класса.

...