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?
}
Was ist 'x' in Ihrer Frage? –
@ Kerrek SB Es ist 42 – user695652
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. –