Sostituire vettoriale e tabella hash con Boost.Bimap
-
11-10-2019 - |
Domanda
Sto cercando di sostituire un vector<string>
e una stringa di mappatura boost::unordered_map<string, size_t>
agli indici nella ex con un boost::bimap
.
Che istanza di bimap
dovrei usare? Finora, sono venuto su con
typedef bimap<
unordered_set_of<size_t>,
vector_of<string>
> StringMap;
, ma non sono sicuro se ho invertito i tipi di raccolta ora. Inoltre, mi chiedo se dovrei cambiare il raccolta di rapporti di tipo . Sarebbe un vector_of_relation
la mia scelta migliore, o un set_of_relation
, o semplicemente andare con il default?
Soluzione
Per ottenere un bimap tra il size_t e std :: string in cui si dispone di ~ costante (fino al costo di hashing e potenziali conflitti) è necessario utilizzare unordered_set_of:
#include <boost/bimap.hpp>
#include <boost/bimap/unordered_set_of.hpp>
#include <string>
#include <iostream>
#include <typeinfo>
int main(int argc, char* argv[]) {
typedef boost::bimap< boost::bimaps::unordered_set_of<size_t>, boost::bimaps::unordered_set_of<std::string> > StringMap;
StringMap map;
map.insert(StringMap::value_type(1,std::string("Cheese")));
map.insert(StringMap::value_type(2,std::string("Cheese2")));
typedef StringMap::left_map::const_iterator const_iter_type;
const const_iter_type end = map.left.end();
for ( const_iter_type iter = map.left.begin(); iter != end; iter++ ) {
std::cout << iter->first << " " << map.left.at(iter->first) << "\n";
}
}
restituisce:
1 Cheese
2 Cheese2
L'unordered_set è una versione spinta di serie che utilizza tabelle hash invece di alberi per memorizzare gli elementi, vedere Boost docs non ordinate .
Guardando i commenti da uno degli esempi bimap a Bimap esempio , abbiamo:
La guarda la mappa a sinistra, simile a un std :: unordered_map
, dato il nome del paese possiamo usarla per cercare la popolazione in tempo costante