2013-12-02 3 views
3

То, что мы учили в школе это:Как объявить (многомерный) массив со значением, введенным пользователем?

int x; 
cin >> x; 
int array[x]; 

ИЛИ

int x, y; 
cin >> x >> y; 
int array[x][y]; 

Однако, я знаю, что это неверный код на C++. Но даже если это так, он все еще выполняет работу и работает так, как ожидалось, однако, я ищу, чтобы найти ответ о том, как это правильно сделано?

+1

Поиск в Интернете или StackOverflow для «реализации матрицы C++». Часто задаваемые вопросы по C++ имеют хорошее обсуждение перегрузки операторов для доступа к матрице. –

ответ

5

Это не стандарт C++, но многие составитель включая gcc и clang поддержку variable length arrays в качестве расширения в C++ несмотря на то, что является особенностью C99. Althought как gcc и clang предупредят вас это расширение, если -pedantic флага используются с сообщением, аналогичным образом:

предупреждения: ISO C++ запрещает переменный массив длиной «массив» [-Wvla]

альтернатива в стандартном C++ будет использовать std::vector или динамическое выделение с помощью нового:

int x; 
cin >> x; 
int *array new int[x] ; 
//... 
delete [] array ; 

2D динамический случай распределения хорошо покрыт в How do I declare a 2d array in C++ using new?. Использование контейнера, вероятно, лучше, так как вам не нужно беспокоиться о , удаляя выделенной памяти.

5

Правильно это делается с динамическими массивами:

int x; 
cin >> x; 
int* array = new int[x]; 

Обратите внимание, что в данном случае это ваша ответственность, чтобы освободить выделенную память; или использовать интеллектуальные указатели.

Другой подход заключается в использовании контейнеров STL, например. vector.

+0

Я бы пошел на 'int * const array';) – user2485710

+0

Не забывайте' delete' и меры предосторожности при исключении, если вы действительно хотите обманывать при манипуляциях с указателем низкого уровня. –

+0

@MikeSeymour: Я думал, что это очевидно, но я расширил свой ответ, спасибо за заметку. – mcserep

3

Обычно это делается либо с помощью стандартного контейнера std :: vector, либо путем динамического распределения массива в куче. Например

int x, y; 
cin >> x >> y; 
int **array = new int * [x]; 

for (size_t i = 0; i < x; i++) array[i] = new int[y]; 
+0

Было бы лучше использовать int i = 0 в цикле вместо size_t i = 0, потому что x объявляется как int. Я просто не принимал во внимание, что x определяется как int. :) –

3

Самый простой способ получить массив динамически размера находится с std::vector:

int x; 
cin >> x; 
vector<int> array(x); 

Многомерные массивы немного сложнее; один вариант:

int x, y; 
cin >> x >> y; 
vector<vector<int>> array(x, vector<int>(y)); 

Более эффективно, но менее просто, вы можете рассмотреть возможность использования одномерного массива размера x*y, с функциями доступа для лечения как двумерный.

Смежные вопросы