45 votes

à l'aide de BOOST_FOREACH avec std::map

J'aimerais effectuer une itération sur un std::map à l'aide de BOOST_FOREACH et de modifier les valeurs. Je ne peux pas tout à fait le faire.

typedef std::pair<int, int> IdSizePair_t;
std::map<int,int> mmap;    
mmap[1] = 1;
mmap[2] = 2;
mmap[3] = 3;
BOOST_FOREACH( IdSizePair_t i, mmap )
    i.second++;
// mmap should contain {2,3,4} here

Bien sûr, cela ne changera rien parce que je ne suis pas de l'itération par référence. J'ai donc remplacer cette ligne à la place (comme par exemple dans le coup de pouce docs):

BOOST_FOREACH( IdSizePair_t &i, mmap )

et j'obtiens l'erreur de compilation:

error C2440: 'initializing' : 
cannot convert from 'std::pair<_Ty1,_Ty2>' to 'IdSizePair_t &'
    with
    [
        _Ty1=const int,
        _Ty2=int
    ]

Toutes les suggestions?

68voto

hvintus Points 1549

Le problème est avec le premier membre de la paire, qui devrait être const. Essayez ceci:

typedef std::map<int, int> map_t;
map_t mmap;  
BOOST_FOREACH( map_t::value_type &i, mmap )
    i.second++;

21voto

Alex Goldberg Points 181

C'est un vieux thread, mais il est plus commode solution.

boost a la notion de " gamme de cartes que d'effectuer une transformation sur itérateur plages. Il existe dans la gamme d'adaptateurs pour cette exacte de cas d'utilisation (une itération sur la carte des clés ou des valeurs): boost::adaptors::map_values et boost::adaptors::map_keys.

Donc, vous pourriez effectuer une itération sur les valeurs de la carte comme ceci:

BOOST_FOREACH(int& size, mmap | boost::adaptors::map_values)
{ 
    ++size;
}

Plus d'informations ici.

4voto

dtw Points 967

Une autre option est d'utiliser BOOST_FOREACH_PAIR, voir ma réponse ici:

http://stackoverflow.com/questions/1713653/boost-foreach-templates-without-typedef/1745774#1745774

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X