C ++ Boost: есть какие-нибудь ошибки с BOOST_FOREACH? - PullRequest
22 голосов
/ 04 апреля 2009

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

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

Ответы [ 5 ]

10 голосов
/ 04 апреля 2009

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

9 голосов
/ 04 апреля 2009

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

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

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

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

8 голосов
/ 04 апреля 2009

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

7 голосов
/ 05 апреля 2009

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

4 голосов
/ 04 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...