Est-il possible d'utiliser boost::foreach avec std::map?
Je trouve boost::foreach très utile car il me permet de gagner beaucoup de l'écriture. Par exemple, disons que je veux imprimer tous les éléments dans une liste:
std::list<int> numbers = { 1, 2, 3, 4 };
for (std::list<int>::iterator i = numbers.begin(); i != numbers.end(); ++i)
cout << *i << " ";
boost::foreach rend le code ci-dessus beaucoup plus simple:
std::list<int> numbers = { 1, 2, 3, 4 };
BOOST_FOREACH (int i, numbers)
cout << i << " ";
Beaucoup mieux! Cependant je n'ai jamais trouvé un moyen (si c'est possible) à utiliser pour std::map
s. La documentation a des exemples avec des types comme vector
ou string
.
- Ce n'est pas exactement un doublon, mais le voir ici: stackoverflow.com/questions/461507/...
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser:
La raison en est que la macro s'attend deux paramètres. Lorsque vous essayez d'insérer le paire de définition, d'introduire un deuxième virgule, faire de la macro trois paramètres à la place. Le préprocesseur ne respecte pas toutes les constructions C++, il ne connaît que le texte.
Quand vous dites
BOOST_FOREACH(pair<int, int>, map)
, le préprocesseur voit ces trois arguments de la macro:1.
pair<int
2.
int>
3.
map
Qui est faux. C'est mentionné pour chaque documentation.
pair<const int, int>
.std::map
protège la clé elle-même: si vous avezmap<Key, Value>
puis le type de valeur estpair<const Key, Value>
. Notez qu'il rend les clés de type const.BOOST_FOREACH(const auto& myPair, map)
- Je utiliser Du coup de pouce de la Gamme Ex de bibliothèque qui implémente un peu de fantaisie gamme d'adaptateurs pour itérer sur la carte des clés ou des valeurs. Par exemple:
Bien sûr vous pouvez. Le truc est, cependant, qu'une carte d'itérateur points à l'une des paires de clés et de valeurs. Il ressemblerait à quelque chose comme ceci:
BOOST_FOREACH(int i, map)
,BOOST_FOREACH(pair<int, int>, map)
, etc. Pouvez-vous poster un exemple de travail?BOOST_FOREACH
est un macro, et donc il ne peut pas traiter correctement la virgule dans la paire d'un modèle. C'est la raison pour laquelle tout le monde est ce qui suggère une définition de type.<>
ne pas introduire un autre argument.C'est possible, mais ce n'est pas vraiment la meilleure façon de faire les choses (comme je l'ai mentionné à quelques reprises avant, for_each presque jamais, et BOOST_FOREACH est à peine mieux). Pour votre premier exemple, je pense que vous seriez mieux avec:
Ça marche pas de même avec une carte, sauf que vous devez définir l'opérateur<< pour elle, car il n'est pas déjà défini:
...et encore une fois,
std::copy
fait le travail très bien:Typedefing une carte paire est source de confusion. Le plus simple moyen pour parcourir une carte avec un n-uplet(tout comme en python):
Et ne vous inquiétez pas, ces virgules de ne pas confondre le préprocesseur parce que j'ai mis entre parenthèses autour d'eux.
Je n'aimais pas l'idée d'être obligé d'ajouter des typedefs chaque fois que je voulais utiliser un foreach sur une carte. Voici donc ma réalisation basée sur la relance de code foreach:
Alors vous pouvez l'utiliser dans votre code:
#define foreach_in_map MUNZEKONZA_FOREACH_IN_MAP
Vous pouvez également modifier les valeurs:
#define foreach_in_map MUNZEKONZA_FOREACH_IN_MAP
Oui:
Dans C++0x, vous pouvez plus facilement faire:
for(int& x : my_array) { x *= 2; }
#include<boost/foreach.hpp
et#define foreach BOOST_FOREACH