Pregunta

Estoy buscando para reemplazar un vector<string> y una cadena de mapeo boost::unordered_map<string, size_t> a los índices en la antigua con un boost::bimap.

¿Qué instancia de bimap debo usar? Hasta el momento, se me ha ocurrido con

typedef bimap<
    unordered_set_of<size_t>,
    vector_of<string>
> StringMap;

pero no estoy seguro de si he invertido la tipos de colección ahora. Además, me pregunto si debería cambiar el colección de las relaciones de tipo . Sería un vector_of_relation ser mi mejor opción, o una set_of_relation, o simplemente ir con el defecto?

¿Fue útil?

Solución

Para obtener una BIMAP entre size_t y std :: string donde se tiene constante (hasta el costo de hash y los enfrentamientos potenciales) ~ es necesario utilizar 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";
  }

}

retornos:

1 Cheese
2 Cheese2

El unordered_set es una versión del impulso conjunto que utiliza tablas hash en lugar de árboles para almacenar los elementos, consulte Boost docs no ordenadas .

En cuanto a los comentarios de uno de los ejemplos BIMAP a BIMAP ejemplo , tenemos:

La vista del mapa izquierdo funciona como un std :: unordered_map , dado el nombre del país podemos utilizarlo para buscar la población en un tiempo constante

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top