BOOST_FOREACH против цикла

Я хотел бы получить ваш совет относительно использования BOOST_FOREACH.

Я прочитал вокруг, что не очень рекомендуется с точки зрения производительности, поскольку это очень тяжелый заголовок.

Более того, он заставляет использовать операторы «break» и «continue», так как вы не можете получить условие выхода, управляемое логическим значением, и мне всегда говорили, что по возможности следует избегать «break» и «continue».

Конечно, преимущества в том, что вы не имеете дело непосредственно с итераторами, которые облегчают задачу итерации по контейнеру.

Что вы думаете об этом ?
Считаете ли вы, что, если он используется, его следует применять систематически, чтобы гарантировать однородность проекта, или его использование рекомендуется только при определенных обстоятельствах?

12

Решение

Я бы сказал, что циклы на основе диапазона C ++ превосходят его. Это эквивалент этот пример BOOST_FOREACH:

std::string hello( "Hello, world!" );
for (auto c : hello)
{
std::cout << c;
}

Я никогда не находил, что мне нужно использовать его в ++ 03.

Заметка при использовании цикла на основе диапазона над контейнерами с дорогими для копирования элементами или в общем контексте лучше всего использовать const& к этим элементам:

SomeContainerType<SomeType> v = ....;
for (const auto& elem : v)
{
std::cout << elem << " ";
}

Точно так же, если вам нужно изменить элементы контейнера, используйте неконстантный & (auto& elem : v).

20

Другие решения

В программировании ясность козырна. Я всегда использовал boost foreach в C ++ 03, нашел его гораздо более читабельным, чем рукописный цикл, размер заголовка не убьет вас. Как правильно заметил @juanchopanza, этот вопрос устарел в C ++ 11.

Ваши проблемы с перерывом и продолжением беспочвенны и, вероятно, контрпродуктивны. С традиционно длинными заголовками цикла C ++ 03 люди склонны не читать заголовок цикла и игнорировать любые условные переменные, которые скрываются в заголовке цикла. Лучше сделайте свое намерение явным с перерывом и продолжайте.

Если вы решили использовать boost foreach, используйте его систематически. В конце концов, он должен быть использован для замены петель для хлеба и масла.

8

Я просто заменил использование BOOST_FOREACH на простой цикл for и получил ускорение на 50%, так что я бы сказал, что это определенно не всегда лучшая вещь для использования.
Вы также не получите счетчик циклов (например, «i»), который иногда вам действительно нужен. Лично я не фанат, но YMMV, если это подходит вашему стилю лучше.

Кстати, «тяжелый заголовок» не повлияет на производительность вашей программы, только на время компиляции.

2