Reemplazar el vector y la tabla hash con Boost.Bimap
-
11-10-2019 - |
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?
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