C++ Boost: есть какие-нибудь ошибки с BOOST_FOREACH?
Это для экспертов Boost. Есть ли какие-либо ошибки или детали, о которых программист должен знать, прежде чем он войдет и заменит все свои старые циклы в стиле C/C++ на наглядный и подлый BOOST_FOREACH
?
(Этот вопрос частично выведен отсюда.)
5 ответов
Взгляни на:
- Статья об условной любви для понимания обоснования
- Подводные камни раздела документации
- Раздел Портативность на тот случай, если вы разрабатываете кроссплатформенные продукты
- Страница ошибок для BOOST_FOREACH
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) - это не то, что я бы назвал "постным и злым":-)