Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

Я бы сказал, что циклы на основе С++ переопределяют его. Это эквивалент этого примера 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).

Ответ 2

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

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

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

Ответ 3

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

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