Я недавно встретил пример кода, который я изучал заранее для будущего использования, и пытаюсь преобразовать его в код, который я могу понять, используя термины, которые я имею ранее изученных. Однако я не смог создать код, который каким-то образом повторяет то, что делает for(auto &it : iostr)
. Может кто-нибудь объяснить, что это делает?Пожалуйста, объясните блок кода «for (auto & it: iostr)»
ответ
Это range-based for
, представленный на C++ 11.
В вашем примере с чем-то называется iostr
как выражение, он перебирает все элементы в iostr
, как указан в пролете begin(iostr)
к end(iostr)
.
В вашем примере с auto &it
как переменная цикла для каждого элемента, it
(это имя, вероятно, является неправильным!) Привязано к этому элементу, и тело цикла выполняется с этим связыванием. Лучше было бы переименовать it
в item
. Или, возможно, ch
, или что бы то ни было, что содержит iostr
.
Это петли над элементами в 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
, чтобы они имели разные типы (если их можно сравнить с помощью !=
), но вы можете прочитать все бой в документации.
[Диапазон для цикла] (http://en.cppreference.com/w/cpp/language/range-for). – songyuanyao
@songyuanyao Я нахожу загадочным, что этот вопрос не кажется дублирующим. –