2010-11-16 8 views
8

Estoy buscando reemplazar una cadena de mapeo vector<string> y boost::unordered_map<string, size_t> a índices en la primera con un boost::bimap.Reemplazar vector y tabla hash con Boost.Bimap

¿Qué instanciación de bimap debo usar? Hasta ahora, he llegado con

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

pero no estoy seguro de si he invertido los tipos de colección ahora. Además, me pregunto si debería cambiar el collection of relations type. ¿Sería un vector_of_relation mi mejor opción, o un set_of_relation, o simplemente elegir el valor predeterminado?

+1

Agregue un poco más de información sobre la forma en que planea usar los datos para que podamos determinar las limitaciones para lograr lo que necesita. –

+0

Quería una biyección entre objetos 'size_t' y' string' con O (1) tiempo de acceso para ambos y requisitos de memoria mínimos o modestos. –

+0

¿Sus cadenas son únicas? –

Respuesta

4

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"; 
    } 

} 

rendimientos:

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 Unordered docs.

En cuanto a los comentarios de uno de los ejemplos BIMAP en Bimap example, tenemos:

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

+0

¿Pero esto me daría O (1) tiempo de acceso para el lado 'size_t' y" hashed O (1) "del otro lado? –

+0

No, no tendría. Aunque espero que esto se corrija con mi edición reciente. Dudo que cualquiera de los accesos (size_t o std :: string) obtengan O (1) en el peor de los casos de esta manera, pero deberían obtener O (1) complejidad promedio de casos. – MGwynne

+0

Ok, aceptado. Aunque recomendaría MultiIndex a cualquier usuario potencial de Bimap. –