Проблемы с пониманием цикла foreach

181
03 августа 2021, 23:10

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] << " ";

Но и с ней не без проблем. Теперь у меня есть несколько вопросов:

  1. При использовании рабочей конструкции у меня не выводится [0] элемент массива, но, если заменить вывод по индексу выводом напрямую переменной element, то такой проблемы не будет

  2. В векторе в дополнение, кроме отсутствия [0] элемента ещё вылетает программа с ошибкой. Решение то же, как в массиве

  3. Почему не понимается конструкция написанная автором?

Answer 1

Начнем с того, что

 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;
     }
    

    Если написать вот так, массив изменяться не будет.

READ ALSO
jQuery.get() исходный код

jQuery.get() исходный код

Как ориентироваться в src папке проекта jquery? Где я могу найти конкретно этот jQueryget метод?:

131
Развернуть список 4-х уровневый список в Laravel

Развернуть список 4-х уровневый список в Laravel

Всем привет, помогите пожалуйста реализовать данный скриптЕсть 4 уровненный список через цикл в виде Laravel

131
Wordpress некоторые картинки битые, не отображаются. Но не все

Wordpress некоторые картинки битые, не отображаются. Но не все

Wordpress некоторые картинки битые, не отображаются

138
Статические файлы CSS Django

Статические файлы CSS Django

Не могу подключить статические файлы к шаблонам HTML в DjangoЯ новичок в Django и не особо в это вник, но, однако, на моём прошлом тестовом проекте...

255