Какие существуют способы инициализации размера массива с помощью пользовательского ввода в С++?

Мне было интересно, какие есть альтернативы выполнению следующего фрагмента кода на С++.

int i;
cin >> i;
int arr[i];

Недавно я начал интересоваться соревновательным программированием и пытался узнать больше.

Обновлено: Для тех комментариев о том, что это не cpp. Он успешно компилируется с make-файлом, который я использую в своем классе, который использует gcc -std=c++11 -o a.exe main.cpp, и возвращается в консоль, когда я ввожу длину 1.

array length: 1

Вы также можете использовать что-то вроде этого: int number = 0; while (cin >> number) { myVector.push_back(number); }, но здесь вы указываете размер напрямую.

NutCracker 07.04.2019 06:17

Этот фрагмент кода не является допустимым C++; многие компиляторы допускают массивы переменной длины в качестве расширения, но в стандартном C++ вам нужно знать размер во время компиляции, если вы не хотите возиться с динамическими массивами, используя new[].

Daniel H 07.04.2019 06:17
Какие разные способы... -- То, как вы показываете нам в вопросе, не C++, так что вы можете забыть о том, как вы показываете нам в своем вопросе.
PaulMcKenzie 07.04.2019 06:39

Изучите C++, а затем начните соревноваться. Если вы попытаетесь сделать это наоборот, вы окажетесь в серьезном невыгодном положении. Вот список хороших ссылок.

user4581301 07.04.2019 06:59

В CP я обычно размещаю все свои массивы с фиксированными размерами, установленными на максимум, указанный в задаче.

eesiraed 07.04.2019 07:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
339
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы должны использовать std::vector вместо этого в С++, например.

int i;
cin >> i;
std::vector<int> arr(i);

Кстати: ВЛА не поддерживается стандартом С++. См. также Массив переменной длины (VLA) в компиляторах C++

Это должен быть принятый ответ. Не знаю, почему ОП этого не сделал.

PaulMcKenzie 07.04.2019 06:38

Похоже, что приведенный выше фрагмент кода работает из-за моей версии gcc, а не из-за C++ объяснение.

adarian 07.04.2019 07:37

@PaulMcKenzie - ОП, вероятно, не примет ответ из-за ошибочного убеждения, что «gcc принимает его код с VLA, поэтому код правильный».

Peter 07.04.2019 08:07

Вот почему я хотел, чтобы компиляторы gcc (и другие) включили параметр VLA выключенный по умолчанию. Многие начинающие программисты ошибочно полагают, что их код "VLA" верен, хотя на самом деле это не так.

PaulMcKenzie 08.04.2019 00:44

Один из способов:

int i = 0;

cin >> i;

auto arr = std::make_unique<int[]>(i); // #include <memory>
        // Or: std::make_shared<int[]>(i);

Другой способ — использовать std::vector:

int i = 0;

cin >> i;

std::vector<int> arr(i); // #include <vector>

Ваш код не C++. Он использует функцию языка C (из версии C99 стандарта C), называемую «массивами переменной длины», где массивы в стеке могут иметь длину, определяемую во время выполнения.

Массивы переменной длины считаются опасными и довольно плохой идеей; видеть:

Почему массивы переменной длины не являются частью стандарта C++?

Если вы скомпилируете свой код, указав компилятору принимать только код, соответствующий стандарту, произойдет сбой: gcc -std=c++11 -pedantic-error. Попробуйте на GodBolt.

В C++ размер массива устанавливается во время компиляции точка. Как и другие пользователи, вы можете использовать динамическое выделение для получения непрерывной области памяти, определяемой во время выполнения, выбранного вами размера: используя std::vector, std::unique_ptr, std::shared_ptr или даже простое выделение с new (хотя последнее не рекомендуется ).

Другие вопросы по теме