usando BOOST FOREACH con std:: mapa


Me gustaría iterar sobre un mapa std::usando BOOST_FOREACH y editar los valores. No puedo entenderlo.

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

Por supuesto, esto no cambia nada porque no estoy iterando por referencia. Así que sustituyo esta línea en su lugar (según el ejemplo en los documentos de Boost):

BOOST_FOREACH( IdSizePair_t &i, mmap )

Y obtengo el error del compilador:

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

Alguna sugerencia?

Author: Deduplicator, 2009-04-28

4 answers

El problema es con el primer miembro del par, que debería ser const. Prueba esto:

typedef std::map<int, int> map_t;
map_t mmap;  
BOOST_FOREACH( map_t::value_type &i, mmap )
    i.second++;
 68
Author: hvintus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-27 22:09:54

Este es un hilo viejo, pero hay una solución más conveniente.

Boost tiene la noción de 'adaptadores de rango' que realizan una transformación en rangos iteradores. Hay adaptadores de rango específicos para este caso de uso exacto (iterando sobre claves o valores de mapa): boost::adaptors::map_values y boost::adaptors::map_keys.

Por lo que podría iterar sobre los valores del mapa como este:

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

Más información aquí.

 21
Author: Alex Goldberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-04 21:41:55

Otra opción es usar BOOST_FOREACH_PAIR, ver mi respuesta aquí:

BOOST_FOREACH & templates sin typedef

 4
Author: dtw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:29:27

A partir de C++11 considere usar la palabra clave auto:

std::map<int,int> mmap;    
mmap[1] = 1;
mmap[2] = 2;
mmap[3] = 3;

BOOST_FOREACH(auto& mpair, mmap)
    mpair.second++;

//mmap will contain {2,3,4} here
 0
Author: K.B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-17 18:44:42