2010-11-16 6 views
8

Ich bin auf der Suche nach einem und einem boost::unordered_map<string, size_t> Mapping-String zu Indizes im ehemaligen mit einem boost::bimap zu ersetzen.Ersetze Vektor und Hash-Tabelle mit Boost.Bimap

Welche Instanziierung von bimap soll ich verwenden? Bisher bin ich mit

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

gekommen, aber ich bin mir nicht sicher, ob ich jetzt die Sammlungstypen umgekehrt habe. Außerdem frage ich mich, ob ich die collection of relations type ändern sollte. Wäre ein vector_of_relation meine beste Wahl, oder ein set_of_relation, oder einfach mit dem Standard gehen?

+1

Fügen Sie einige weitere Informationen über die Art und Weise, in der Sie planen, die Daten zu verwenden, so können wir die Einschränkungen für das Erfüllen, was Sie benötigen. –

+0

Ich wollte eine Bijektion zwischen 'size_t' und' string' Objekten mit O (1) Zugriffszeit für beide und minimale oder bescheidene Speicheranforderungen. –

+0

Sind alle Saiten eindeutig? –

Antwort

4

Um eine bimap zwischen size_t und std :: string zu bekommen, wo Sie ~ konstant (bis zu den Kosten für Hashing und mögliche Kollisionen) Sie unordered_set_of verwenden müssen:

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

} 

kehrt:

1 Cheese 
2 Cheese2 

Die unordered_set ist eine Boost-Version des Satzes, die anstelle von Bäumen Hash-Tabellen verwendet, um die Elemente zu speichern, siehe Boost Unordered docs.

Mit Blick auf die Kommentare von einem der bimap Beispiele bei Bimap example, haben wir:

Die linke Kartenansicht wie ein std :: Werk unordered_map < std :: string, long>, angesichts der Namen des Landes können wir es verwenden, um die Bevölkerung in konstanter Zeit zu suchen

+0

Aber würde mir das O (1) Zugriffszeit für die "size_t" Seite und "hashed O (1)" von der anderen Seite geben? –

+0

Nein, hätte es nicht. Obwohl dies hoffentlich mit meiner letzten Bearbeitung korrigiert wird. Ich bezweifle, dass beide Zugriffe (size_t oder std :: string) im schlimmsten Fall O (1) auf diese Weise erhalten, aber sie sollten O (1) durchschnittliche Fallkomplexität erhalten. – MGwynne

+0

Ok, akzeptiert. Ich würde MultiIndex jedoch allen potenziellen Benutzern von Bimap empfehlen. –