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

С++ Boost: Есть ли какие-либо ошибки с BOOST_FOREACH?

Это для экспертов Boost. Есть ли какие-либо подробности или детали, о которых программист должен знать, прежде чем он войдет и заменит все свои старые циклы стиля C/С++ на художественно-ориентированный BOOST_FOREACH?

(Этот вопрос частично получен из здесь.)

4b9b3361

Ответ 1

Взгляните на:

  • Условная любовь для понимания обоснования
  • Pitfalls раздел документации
  • Раздел Portability на всякий случай, если вы разрабатываете кросс-платформенные продукты.
  • Страница ошибок для BOOST_FOREACH

Ответ 2

BOOST_FOREACH - макрос, мне не нравятся макросы и предпочитают использовать алгоритмы STL + lambda + bind.

Также С++ 0x будет содержать for-loop аналогично на BOOST_FOREACH:

int my_array[5] = {1, 2, 3, 4, 5};
for(int &x : my_array)
{
  x *= 2;
}

это еще одна причина, по которой не используйте частично мертвые BOOST_FOREACH.

Ответ 3

Как это просто макрос, вы не можете использовать запятые в именах типов, так что BOOST_FOREACH(pair<int,int> A, mapB){}
не будет работать.
Для других недостатков я бы посоветовал документацию BOOST_FOREACH().

Ответ 4

Я профилировал BOOST_FOREACH по сравнению с контуром с ручным кодированием. BOOST_FOREACH был примерно на 30% медленнее в простом цикле, который увеличивал элементы вектора размером 100 000. Итак, если вы кодируете небольшой цикл, это будет не так быстро. Как только ваша петля выполняет основную обработку, закон Amdahl вводится, а потеря из-за BOOST_FOREACH незначительна.

Ответ 5

Взгляните на источник макроса BOOST_FOREACH (в foreach.hpp) - это не то, что я бы назвал "худым и средним": -)