проблемой. Мне нужно создать массив длинны n, где n вводится в консоль. Но если я пишу:
int n;
cin >> n;
int array[n];
То возникает ошибка т.к. n нельзя считать константой.
Я понимаю, что можно применить const, но тогда как мне ввести значение в командной строке?
три варианта: 1. создать массив заведомо больше n 2. создать массив в динамической памяти int* array = new int[n]; ... delete[] array; 3. использовать std::vector std::vector<int> array(n);
Можешь обратить внимание на выделение динамической памяти с си (malloc, calloc, realloc) http://cppstudio.com/cat/309/324/ Но лучше пока подождать с этим и изучить указатели, чтобы лучше разобраться в материале или же посмотреть в сторону векторов
А как создать с помощью std::vector<int> двумерные массивы?
std::vector<std::vector<int>> matrix(n, std::vector<int>(m));
но здесь ты должен понимать, произойдет m + 1 аллокация памяти, поэтому можешь помимо этого наивного варианта использовать линейную развертку в памяти std::vector<int> matrix(n*m); и вычислять индекс по формуле: index(i, j) = i*m + j
Спасибо огромное. Так сработало.
плюсы мало кто осилил галопом, изучай последовательно по методичке
Это не двумерный массив а хрень
Так по методичке и изучаю. Видимо не лучшую методичку выбрал
Ошибка всё-таки возникла. Из-за того, что m - локальная переменная
ты чуток ниже на одно сообщение тоже прочти на всякий. а так да, строго говоря, это вектор векторов, но он отлично имитирует двумерный массив.
тогда все пропало
Оно плохо имитирует. Потому как память под данные выделена отдельными несвязанными кусками. И потому если захочется вызвать какой-нибудь GEMM - произойдет облом.
Вы как-то все в одну сторону тянете одеядо, да, memory layout вектора векторов не совпадает с двумерным массивом, но не всегда это нужно и возможно для матриц большой размерности. И плюс ниже я привел линейную развертку, она как раз полностью соответствует двумерному массиву в плане memory layout
Обсуждают сегодня