Come osservato Steve Townsend, std::map
è simile nel concetto, ma ha una diversa implementazione.
Creare il contenitore nidificato in C++ è un po 'più dettagliato:
#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);
Come documentato in perlref, frecce tra parentesi subscripting sono opzionali, così si potrebbe avere scritto (ha commentato per mantenere il flusso del programma C++)
// $foo{"bar1"}{"Default"} = 15;
che è abbastanza vicino a C++:
foo["bar1"]["Default"] = 15;
Per buona misura, abbiamo stampare la struttura risultante e tornare 0 da 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;
}
uscita:
bar1:
- Value => 0
- Default => 15
bar2:
- Default => 2
- value => 5
- other => 4
NOTA: ingresso e di uscita hanno lo stesso ordine in questo programma giocattolo, ma non dipendono da questo comportamento!
Se invece si preferisce utilizzare boost::unordered_map
, cambiare alcune linee nella parte superiore del vostro programma:
#include <boost/unordered_map.hpp>
typedef boost::unordered_map< std::string, int > Inner;
typedef boost::unordered_map< std::string, Inner > Outer;
Nota che risponde riferimento std :: mappa non si tradurrà in tabelle hash. Questi sono contenitori associativi basati su BTree. Devi passare a Boost Unordered o al nuovo STL, che include le tabelle hash in modo nativo. –
Questa è stata una domanda sorprendentemente divertente. Buon lavoro @saran –