Como se señaló Steve Townsend, std::map
es similar en concepto, pero tiene una aplicación diferente.
Creación de su contenedor anidado en C++ es un poco más detallado:
#include <tr1/unordered_map>
#include <iostream>
typedef std::tr1::unordered_map< std::string, int > Inner;
typedef std::tr1::unordered_map< std::string, Inner > Outer;
int main()
{
Outer foo;
Inner::value_type bar1_data[] = {
Inner::value_type("Default", 0),
Inner::value_type("Value", 0),
};
const size_t n_bar1_data = sizeof(bar1_data)/sizeof(*bar1_data);
foo["bar1"] = Inner(bar1_data, bar1_data + n_bar1_data);
Inner::value_type bar2_data[] = {
Inner::value_type("Default", 2),
Inner::value_type("value", 5),
Inner::value_type("other", 4),
};
const size_t n_bar2_data = sizeof(bar2_data)/sizeof(*bar2_data);
foo["bar2"] = Inner(bar2_data, bar2_data + n_bar2_data);
como se documenta en perlref, flechas entre corchetes subíndices son opcionales, por lo que podría haber escrito (comentó para mantener el flujo del programa en C++)
// $foo{"bar1"}{"Default"} = 15;
que es bastante cerca de C++:
foo["bar1"]["Default"] = 15;
En buena medida es la impresión de la estructura resultante y devolver 0 de main
:
for (Outer::const_iterator o = foo.begin(); o != foo.end(); ++o) {
std::cout << o->first << ":\n";
for (Inner::const_iterator i = o->second.begin(); i != o->second.end(); ++i)
std::cout << " - " << i->first << " => " << i->second << '\n';
}
return 0;
}
Salida:
bar1:
- Value => 0
- Default => 15
bar2:
- Default => 2
- value => 5
- other => 4
NOTA: entrada y salida tienen el mismo orden en este programa de juguete, pero ¡no dependa de este comportamiento!
Si por el contrario prefiere utilizar boost::unordered_map
, cambiar unas pocas líneas en la parte superior de su programa:
#include <boost/unordered_map.hpp>
typedef boost::unordered_map< std::string, int > Inner;
typedef boost::unordered_map< std::string, Inner > Outer;
Nota de respuestas aún referencia a std :: mapa no dará lugar a las tablas hash. Estos son contenedores asociativos basados en BTree. Debe ir a Boost Unordered, o al nuevo STL, que incluye tablas hash de forma nativa. –
Esto resultó ser una pregunta sorprendentemente entretenido. Buen trabajo @saran –