2009-04-04 4 views

Répondre

10

Jetez un oeil à:

+1

Le point 1 est-il un problème pour BOOST_FOREACH? Comme je l'ai compris BOOST_FOREACH, évalué chaque paramètre une fois et une seule fois. Non? "Il évalue ses arguments exactement une fois, ce qui ne provoque aucune mauvaise surprise" --docs – Catskul

4

Jetez un oeil à la source de la macro BOOST_FOREACH (en foreach.hpp) - ce n'est pas ce que je qualifierais de « simple et léger » :-)

8

Comme il est juste une macro, vous ne pouvez pas utiliser des virgules dans typenames, si
BOOST_FOREACH(pair<int,int> A, mapB){}
ne fonctionnera pas. Pour d'autres inconvénients, je consulterais le BOOST_FOREACH() documentation.

+0

Je crois que BOOST_FOREACH ((paire A), mapB) devrait fonctionner. Je n'ai pas vérifié. –

+0

Ne fonctionnera pas, et j'ai passé une demi-journée à essayer de le comprendre, jusqu'à ce que soudainement je me suis senti une macro. Macro ne comprend pas les modèles et ils pensent que la virgule est juste un autre argument pour remplacer –

+0

'auto' est votre ami! 'BOOST_FOREACH (auto a, mapB) {...}' – Gabriel

9

BOOST_FOREACH - macro, je n'aime pas les macroses et préfère utiliser les algorithmes STL + lambda + bind.

également C++0x Contiendra for-loop similaires sur BOOST_FOREACH:

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

il est une raison supplémentaire pour ne pas utiliser BOOST_FOREACH Partialy morts.

+2

En fait, c'est la raison pour laquelle j'ai commencé à utiliser BOOST_FOREACH.La syntaxe est assez similaire pour que, une fois la construction C++ 0x disponible, vous puissiez mettre à jour votre code avec une simple opération de recherche-remplacement regex. – Ferruccio

+1

Je suis sceptique, très sceptique. tr1 n'est toujours pas disponible partout et c'était il y a longtemps. C++ 09 sera pleinement utilisable d'ici 2020 à ce rythme, si C++ ne meurt pas de ballonnement. –

+0

Oui, certains peuples n'utilisent pas/comme STL pour cette fois et n'utiliseront pas les nouvelles fonctionnalités C++ 0x jusqu'en 2020. Mais les faits disent ensuite: les compilateurs VC et GCC prennent déjà en charge certaines fonctionnalités C++ 0x. – bayda

7

J'ai profilé BOOST_FOREACH par rapport à une boucle codée à la main. BOOST_FOREACH était environ 30% plus lent dans une simple boucle qui incrémentait les éléments d'un vecteur de taille 100 000. Donc, si vous codez une petite boucle, ça ne va pas être aussi rapide. Une fois que votre boucle effectue un traitement majeur, la loi d'Amdahl entre en jeu et la perte due à BOOST_FOREACH est négligeable.

Questions connexes