2016-07-19 12 views
0

Ich habe eine ungeordnete Karte von Foo-Objekten und ich würde gerne effizient testen, ob der Schlüsselsatz von Foo-Objekten mit einer bestimmten ID enthält.std :: unordered_map <Foo, Bar> testen, ob spezifische Foo Schlüssel vorhanden ist

Ein Weg wäre, ein Foo-Objekt zu konstruieren und seine ID auf den Abfragewert zu setzen, aber ich frage mich, ob es einen eleganteren Weg gibt, dies zu erreichen (vielleicht mit einer anderen Datenstruktur)?

class Foo { 

    public: 
     int id; 
}; 

namespace std 
{ 
    template<> 
    struct hash<Foo> { 
     std::size_t operator()(Foo const& f) const { 
      return std::hash<int>()(f.id); 
     } 
    }; 

    template<> 
    struct equal_to<Foo> { 
     bool operator()(const Foo &lhs, const Foo &rhs) const { 
      return lhs.id == rhs.id; 
     } 
    }; 
} 


int main() { 

    unordered_map<Foo, int> dict; 

    Foo f; 
    f.id = 123; 

    dict[f] = 1; 

    //How to test if Foo object with id x is present in dict? 

} 
+1

Was ist 'x' in Ihrer Frage? –

+0

@ Kerrek SB Es ist 42 – user695652

+1

Verwenden Sie in C++ 14 'std :: map >' und führen Sie eine heterogene Suche durch (mit dem entsprechenden 'operator <' definiert), um die Erstellung eines zu vermeiden vorübergehend 'Foo'. Spezialisieren Sie auch nicht 'equal_to'. Schreiben Sie entweder einen Operator == oder definieren Sie Ihren eigenen Prädikat-Typ. –

Antwort

3

Nein, es gibt keine effizientere Art und Weise als ein Foo Objekt mit dem id erstellen, die Sie mit dieser aktuellen Kollektion testen möchten. Sie sind "stecken" mit dem Schlüsseltyp, den Sie an erster Stelle ausgewählt haben.

Wenn Sie das Wörterbuch mit einer int-Eigenschaft indexieren möchten, sollten Sie diese Eigenschaft als Schlüssel verwenden und den Foo-Objektteil des Werts verwenden. (Das könnte in diesem Fall wie unordered_map<int, pair<Foo, int>> aussehen.)