2010-11-16 15 views
8

Sto cercando di sostituire una stringa di mapping vector<string> e boost::unordered_map<string, size_t> in indici nella prima con uno boost::bimap.Sostituisci tabella vettoriale e hash con Boost.Bimap

Quale istanza di bimap devo usare? Finora, ho inventato

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

ma non sono sicuro di aver invertito i tipi di raccolta ora. Inoltre, mi chiedo se dovrei cambiare il collection of relations type. Sarebbe un vector_of_relation essere la mia scelta migliore, o un set_of_relation, o semplicemente andare con il predefinito?

+1

Aggiungere alcune ulteriori informazioni sul modo in cui si prevede di utilizzare i dati in modo da poter determinare i vincoli per realizzare ciò che è necessario. –

+0

Volevo una biiezione tra gli oggetti 'size_t' e' string' con O (1) tempo di accesso per entrambi e minimi o modesti requisiti di memoria. –

+0

Le tue stringhe sono tutte uniche? –

risposta

4

Per ottenere un bimap tra il size_t e std :: string in cui si dispone di ~ costante (fino al costo di hashing e potenziali conflitti) è necessario utilizzare 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"; 
    } 

} 

rendimenti:

1 Cheese 
2 Cheese2 

L'unordered_set è una versione spinta di serie che usa tabelle hash invece di alberi per memorizzare gli elementi, vedi Boost Unordered docs.

Guardando i commenti da uno degli esempi bimap a Bimap example, abbiamo:

La guarda la mappa a sinistra, simile a uno std :: unordered_map < std :: string, lunga>, dato il nome del paese possiamo usarlo per cercare la popolazione in un tempo costante

+0

Ma questo mi darà O (1) tempo di accesso per il lato 'size_t' e" hash O (1) "dall'altro lato? –

+0

No, non avrebbe. Anche se si spera, questo è corretto con la mia recente modifica. Dubito che l'accesso (size_t o std :: string) ottenga O (1) nel caso peggiore in questo modo, ma dovrebbero ottenere O (1) complessità del caso medio. – MGwynne

+0

Ok, accettato. Raccomando MultiIndex a tutti i potenziali utenti di Bimap, però. –