Мне было интересно, какие есть альтернативы выполнению следующего фрагмента кода на С++.
int i;
cin >> i;
int arr[i];
Недавно я начал интересоваться соревновательным программированием и пытался узнать больше.
Обновлено: Для тех комментариев о том, что это не cpp. Он успешно компилируется с make-файлом, который я использую в своем классе, который использует gcc -std=c++11 -o a.exe main.cpp
, и возвращается в консоль, когда я ввожу длину 1.
array length: 1
Этот фрагмент кода не является допустимым C++; многие компиляторы допускают массивы переменной длины в качестве расширения, но в стандартном C++ вам нужно знать размер во время компиляции, если вы не хотите возиться с динамическими массивами, используя new[]
.
Изучите C++, а затем начните соревноваться. Если вы попытаетесь сделать это наоборот, вы окажетесь в серьезном невыгодном положении. Вот список хороших ссылок.
В CP я обычно размещаю все свои массивы с фиксированными размерами, установленными на максимум, указанный в задаче.
Вы должны использовать std::vector
вместо этого в С++, например.
int i;
cin >> i;
std::vector<int> arr(i);
Кстати: ВЛА не поддерживается стандартом С++. См. также Массив переменной длины (VLA) в компиляторах C++
Это должен быть принятый ответ. Не знаю, почему ОП этого не сделал.
Похоже, что приведенный выше фрагмент кода работает из-за моей версии gcc, а не из-за C++ объяснение.
@PaulMcKenzie - ОП, вероятно, не примет ответ из-за ошибочного убеждения, что «gcc принимает его код с VLA, поэтому код правильный».
Вот почему я хотел, чтобы компиляторы gcc (и другие) включили параметр VLA выключенный по умолчанию. Многие начинающие программисты ошибочно полагают, что их код "VLA" верен, хотя на самом деле это не так.
Один из способов:
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
(хотя последнее не рекомендуется ).
Вы также можете использовать что-то вроде этого:
int number = 0; while (cin >> number) { myVector.push_back(number); }
, но здесь вы указываете размер напрямую.