2010-11-16 6 views
8

Je cherche à remplacer un vector<string> et une chaîne de mappage boost::unordered_map<string, size_t> aux indices dans le premier avec un boost::bimap. Quelle instanciation de bimap devrais-je utiliser? Jusqu'ici, je suis venu avecRemplacer le vecteur et table de hachage avec Boost.Bimap

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 collection maintenant. Aussi, je me demande si je devrais changer le collection of relations type. Est-ce qu'un vector_of_relation serait mon meilleur choix, ou un set_of_relation, ou tout simplement aller avec la valeur par défaut?

+1

Ajoutez plus d'informations sur la façon dont vous prévoyez d'utiliser les données afin que nous puissions déterminer les contraintes pour accomplir ce dont vous avez besoin. –

+0

Je voulais une bijection entre les objets 'size_t' et' string' avec un temps d'accès O (1) pour les deux et des besoins en mémoire minimaux ou modestes. –

+0

Vos chaînes sont-elles uniques? –

Répondre

4

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:

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

} 

retours:

1 Cheese 
2 Cheese2 

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 example, nous avons:

La vue sur la carte gauche fonctionne comme un std :: unordered_map < std :: string, long>, donné le nom du pays nous pouvons l'utiliser pour rechercher la population à temps constant

+0

Mais est-ce que cela me donnerait O (1) temps d'accès pour le côté 'size_t' et" hashed O (1) "de l'autre côté? –

+0

Non, il n'aurait pas. Bien que j'espère que ceci est corrigé avec ma modification récente. Je doute que l'accès (size_t ou std :: string) obtienne O (1) dans le pire des cas de cette façon, mais ils doivent obtenir la complexité moyenne d'un cas O (1). – MGwynne

+0

Ok, accepté. Je recommanderais MultiIndex à tous les utilisateurs potentiels de Bimap, cependant. –

Questions connexes