2017-02-13 20 views
0

Я недавно встретил пример кода, который я изучал заранее для будущего использования, и пытаюсь преобразовать его в код, который я могу понять, используя термины, которые я имею ранее изученных. Однако я не смог создать код, который каким-то образом повторяет то, что делает for(auto &it : iostr). Может кто-нибудь объяснить, что это делает?Пожалуйста, объясните блок кода «for (auto & it: iostr)»

+11

[Диапазон для цикла] (http://en.cppreference.com/w/cpp/language/range-for). – songyuanyao

+0

@songyuanyao Я нахожу загадочным, что этот вопрос не кажется дублирующим. –

ответ

4

Это range-based for, представленный на C++ 11.

В вашем примере с чем-то называется iostr как выражение, он перебирает все элементы в iostr, как указан в пролете begin(iostr) к end(iostr).

В вашем примере с auto &it как переменная цикла для каждого элемента, it (это имя, вероятно, является неправильным!) Привязано к этому элементу, и тело цикла выполняется с этим связыванием. Лучше было бы переименовать it в item. Или, возможно, ch, или что бы то ни было, что содержит iostr.

0

Это петли над элементами в iostr.

Per this excellent reference (который вы должны получить в привычку использовать), эта конструкция находится в точности эквивалентно:

{ 
    auto && __range = iostr; 
    for (auto __begin = std::begin(__range), __end = std::end(__range); 
      __begin != __end; 
      ++__begin) { 
     auto& it = *__begin; 
     // (your loop body here) 
    } 
} 

Или, просто в этом случае:

for (auto __begin = std::begin(iostr), __end = std::end(iostr); 
      __begin != __end; 
      ++__begin) { 
     auto& it = *__begin; 
    // (your loop body here) 
} 

С C++ 17, существует небольшая модификация того, как объявляются __begin и __end, чтобы они имели разные типы (если их можно сравнить с помощью !=), но вы можете прочитать все бой в документации.