2009-04-04 10 views

Respuesta

10

Tome un vistazo a:

+1

¿Es el punto 1 un problema para BOOST_FOREACH? Como lo entendí BOOST_FOREACH, evalué cada parámetro una vez y solo una vez. ¿No? "Evalúa sus argumentos exactamente una vez, lo que no genera sorpresas desagradables" --docs – Catskul

4

Tome un vistazo a la fuente de la macro BOOST_FOREACH (en foreach.hpp) - no es lo que yo llamaría "clara y directa" :-)

8

ya que es sólo una macro, no se puede utilizar comas en typenames, por lo
BOOST_FOREACH(pair<int,int> A, mapB){}
no funcionará
Para otras desventajas consultaría el BOOST_FOREACH() documentation.

+0

Creo que BOOST_FOREACH ((par A), mapB) debería funcionar. No revisé sin embargo. –

+0

No funciona, y me pasé medio día tratando de resolverlo, hasta que de repente me dijo que era un macro. Las macros no entienden las plantillas y creen que la coma es solo otro argumento para reemplazar –

+0

'auto' es tu amigo! 'BOOST_FOREACH (auto a, mapB) {...}' – Gabriel

9

BOOST_FOREACH - macro, no me gustan las macros y prefiero usar los algoritmos STL + lambda + bind.

también contendrá C++0xfor-loop similar sobre BOOST_FOREACH:

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

que es una razón adicional para no usar BOOST_FOREACH PARCIALMENTE muertos.

+2

En realidad, esta es la razón por la que comencé a usar BOOST_FOREACH.La sintaxis es lo suficientemente similar para que una vez que la construcción C++ 0x esté disponible, pueda actualizar su código con una simple operación de búsqueda y reemplazo de expresiones regulares. – Ferruccio

+1

Soy escéptico, muy escéptico. tr1 todavía no está disponible en todas partes y eso fue hace mucho tiempo. C++ 09 será totalmente utilizable para el año 2020 a esta velocidad, si C++ no muere a causa de la hinchazón. –

+0

Sí, algunas personas no usan/como STL para este momento y no usarán las nuevas características de C++ 0x hasta 2020. Pero los hechos dicen lo siguiente: los compiladores de VC y GCC ya soportan algunas características de C++ 0x. – bayda

7

perfilé BOOST_FOREACH frente a un lazo codificado a mano. BOOST_FOREACH fue aproximadamente un 30% más lento en un bucle simple que incrementó los elementos de un vector de tamaño 100.000. Por lo tanto, si está codificando un bucle pequeño, no será tan rápido. Una vez que su ciclo realiza un procesamiento importante, la Ley de Amdahl se activa y la pérdida debida a BOOST_FOREACH es insignificante.

Cuestiones relacionadas