Пример размера массива
У меня были проблемы с пониманием, почему
int n;
cin>>n;
int arr[n];
работает. Мне сказали, что этот код не должен выполняться, потому что значение 'n' может быть объявлено только во время выполнения и, следовательно, не должно компилироваться. Мне также сказали, что моя переменная 'n' должна быть постоянной. Как вы делаете его постоянным, когда есть "cin>>" (у меня проблемы с пониманием, как вписать константу). Я знаю, что код довольно прост, но я в конфликте из-за того, что мне сказали.
2 ответа
Согласно стандарту C++ ([dcl.array])
В декларации T D, где D имеет вид
D1 [ постоянное выражениеopt ] атрибут-спецификатор-seqopt
размер массива должен быть постоянным (или не указываться соответствующим инициализатором).
Однако некоторые разработчики компиляторов решили разрешить использование массивов переменной длины (VLA) для удобства программиста, чтобы поддерживать возможность компилировать код C на C++ (C допускает VLA начиная со стандарта C99), или какую-то гнусную цель, которую мы можем изучить только после того как они покорили мир.
Лучшее стандартное совместимое решение заключается в использованииstd::vector
когда размер выделения не может быть известен во время компиляции.
int n;
if (cin>>n) // don't allocate unless n is valid
{
vector<int> arr(n);
// use arr
}
Даже если VLA доступен, vector
все еще более безопасное решение. vector
выделяется из динамического хранилища, часто гораздо большего хранилища данных, чем автоматическое хранилище, и в случае неудачного выделения генерируется исключение. Поведение массива переменной длины, которое слишком велико для хранения, часто не определено и, вероятно, переполняет стек (обычная форма автоматического хранения), что приводит к множеству загадочных ошибок.
Выделение сырой памяти с new
его следует избегать, так как он получает дополнительное управление (его необходимо удалить вручную в какой-то момент delete[]
) и бухгалтерский учет (размер распределения неизвестен указателю) обязанностей. Программист, возможно, теперь также должен обратиться к правилам три и пять.
Люди больше не используют массивы, используют вектор или список, вам не нужно беспокоиться об их размерах, и есть множество полезных функций, доступных для обработки данных в них.