Считается ли инициализация итератора внутри цикла циклом плохим стилем и почему?

Как правило, вы найдете код STL следующим образом:

for (SomeClass::SomeContainer::iterator Iter = m_SomeMemberContainerVar.begin(); Iter != m_SomeMemberContainerVar.end(); ++Iter)
{
}

Но на самом деле у нас есть рекомендация написать это так:

SomeClass::SomeContainer::iterator Iter = m_SomeMemberContainerVar.begin();
SomeClass::SomeContainer::iterator IterEnd = m_SomeMemberContainerVar.end();
for (; Iter != IterEnd; ++Iter)
{
}

Если вас беспокоит область видимости, добавьте фигурные скобки:

{
    SomeClass::SomeContainer::iterator Iter = m_SomeMemberContainerVar.begin();
    SomeClass::SomeContainer::iterator IterEnd = m_SomeMemberContainerVar.end();
    for (; Iter != IterEnd; ++Iter)
    {
    }
}

Предполагается, что это даст выигрыш в скорости и эффективности, особенно если вы программируете консоли, поскольку функция .end () не вызывается на каждой итерации цикла. Я просто считаю улучшение производительности само собой разумеющимся, оно звучит разумно, но я не знаю, насколько оно сильно, и оно, безусловно, зависит от типа контейнера и фактической реализации STL. Но, используя этот стиль пару месяцев, я все равно предпочитаю его первому.

Причиной является удобочитаемость: строка является опрятной и аккуратной. С квалификаторами и переменными-членами в реальном производственном коде довольно легко получитьдействительно длинные строки, если вы используете стиль в первом примере. Вот почему я намеренно сделал так, чтобы в этом примере была горизонтальная полоса прокрутки, просто чтобы вы поняли, о чем я говорю. ;)

С другой стороны, вы неожиданно вводите переменные Iter во внешнюю область цикла for. Но тогда, по крайней мере, в среде, в которой я работаю, ИТЭР был бы доступен во внешней области даже в первом примере.

Что вы думаете об этом? Есть ли какие-то плюсы в первом стиле, кроме как ограничивающие возможности Iter?

Ответы на вопрос(13)

Ваш ответ на вопрос