C++ Boost: есть какие-нибудь ошибки с BOOST_FOREACH?

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

(Этот вопрос частично выведен отсюда.)

5 ответов

Решение

Взгляни на:

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

Также C++0x будет содержать цикл for, аналогичный BOOST_FOREACH:

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

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

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

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

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

Другие вопросы по тегам