Remplacer vecteur et table de hachage avec Boost.Bimap
-
11-10-2019 - |
Question
Je cherche à remplacer un vector<string>
et une chaîne de cartographie boost::unordered_map<string, size_t>
à des indices dans l'ancienne avec un boost::bimap
.
Qu'est-ce que instanciation de bimap
dois-je utiliser? Jusqu'à présent, je suis venu avec
typedef bimap<
unordered_set_of<size_t>,
vector_of<string>
> StringMap;
mais je ne suis pas sûr si j'ai inversé les types de collecte maintenant. Aussi, je me demande si je dois changer le
La solution Pour obtenir un bimap entre size_t et std :: string où vous avez ~ constant (au coût de hachage et des affrontements potentiels), vous devez utiliser unordered_set_of: retours: Le unordered_set est une version d'amplification de jeu qui utilise des tables de hachage au lieu d'arbres pour stocker les éléments, voir Boost Unordered docs . En regardant les commentaires de l'un des exemples de bimap à Bimap exemple , nous avons: La vue sur la carte gauche fonctionne comme un std :: unordered_map #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";
}
}
1 Cheese
2 Cheese2