https://www.youtube.com/watch?v=j0_0699UZF4&list=PLQOaTSbfxUtCrKs0nicOg2npJQYSPGO9r&index=163&t=329s
Изучение цикла начал в этом видео и сразу же попробовал реализовать его сам и столкнулся с такой проблемой. Автор в видео использовал эту конструкцию:
for each (int var in arr)
cout << var;
У меня же эту конструкцию компилятор не понимает, подчеркивает each и in
Бродя на просторах интернета наткнулся на другую реализацию этого цикла, она же у меня работает
for (auto element : arr)
cout << arr [element] << " ";
Но и с ней не без проблем. Теперь у меня есть несколько вопросов:
При использовании рабочей конструкции у меня не выводится [0] элемент массива, но, если заменить вывод по индексу выводом напрямую переменной element, то такой проблемы не будет
В векторе в дополнение, кроме отсутствия [0] элемента ещё вылетает программа с ошибкой. Решение то же, как в массиве
Почему не понимается конструкция написанная автором?
Начнем с того, что
for each (int var in arr)
- это кусок на C# или на C++/CLI. Это другой язык, не стандартный C++.
Далее,
for (auto element : arr)
cout << arr [element] << " ";
-это не "другая" реализация, а единственная существующая в актуальных на данный момент стандартах языка (C++11,14,17) конструкция цикла по контейнеру, но применили вы ее неверно - у вас element - это уже элемент из массива, а не индекс элемента в массиве, поэтому писать надо так:
for (auto element : arr)
cout << element << " ";
А теперь, чтобы написать совсем хорошо, следует поправить код вот так:
for (const auto& element : arr)
{
cout << element << " ";
}
const заставит компилятор ругаться на вас, если вы заходите изменять элемент в массиве - опечатаетесь, например. Правильный синтаксис для изменения элементов:
for (auto& element : arr)
{
cin >> element;
}
Классическая ошибка при этом - забыть поставить ссылку
for (auto element : arr)
{
cin >> element;
}
Если написать вот так, массив изменяться не будет.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей