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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top