2009-04-08 21 views
17

Tengo problemas para iterar en reversa sobre un mapa en gcc C++. Cuando uso un iterador inverso, parece que no puedo asignarle nada; el compilador se queja. Estoy trabajando con un código incómodo utilizando un iterador directo, pero no es muy elegante. ¿Alguna idea?cómo iterar en reversa sobre un mapa en C++

+0

Lo que no nos has dicho es lo que quieres hacer. – tpdi

+0

Suena como si estuvieras usando un iterador inverso, pero igual llamas de inicio y fin en lugar de reiniciar y deshacer. La solución de GMan puede ser lo que estás buscando. Pero publicar un código nos ayudará a ayudarlo. – Smashery

+0

Gracias - Pensé que había intentado el rbegin/rend, pero debo haberme enredado de alguna manera. –

Respuesta

36

He aquí un ejemplo de la iteración hacia atrás a través de una std::map:

#include <iostream> 
#include <map> 
#include <string> 

int main() { 
    std::map<std::string, std::string> m; 
    m["a"] = "1"; 
    m["b"] = "2"; 
    m["c"] = "3"; 

    for (auto iter = m.rbegin(); iter != m.rend(); ++iter) { 
     std::cout << iter->first << ": " << iter->second << std::endl; 
    } 
} 

Si usted es pre-C++ 11, usted sólo tiene que explicar auto, que es:

std::map<std::string, std::string>::reverse_iterator 

Tenga en cuenta que si usa boost, puede usar un bucle for basado en rango con un adaptador inverso:

#include <boost/range/adaptor/reversed.hpp> 

for (auto& iter : boost::adaptors::reverse(m)) { 
    std::cout << iter.first << ": " << iter.second << std::endl; 
} 
+0

typename no es necesario allí –

+0

Vaya, he estado escribiendo un montón de cosas con plantilla últimamente, lo quité, gracias. : X – GManNickG

+1

¿es posible usar 'auto' aquí? – Chani