Ich habe eine funktionierende Implementierung nun, dass die Karten Schlüssel von Bereichen, etwa so:Schnelle Karte Implementierung in C++
class Range {
public:
Range(int from, int to = -1) : _from(from), _to(to >= 0 ? to : from) {}
bool operator < (const Range& item) {
return _to < item._from;
}
bool operator == (const Range& item) {
return item._from >= _from && item._to <= _to;
}
private:
int _from, _to;
};
typedef std::map<Range, MappedType> my_map_type;
Coole Sache dabei ist, dass ich tun kann:
my_map_type m;
m[Range(0, 20)] = Item1;
m[Range(30,40)] = Item2;
my_map_type::iterator it = m.find(15);
assert(it->second == Item1);
it = m.find(40);
assert(it->second == Item2);
it = m_find(25);
assert(it == m.end());
Aber ich brauche eine schnellere Kartenimplementierung als Std :: Karte. Einfügungen sind in Ordnung, um langsam zu sein, aber Funde müssen wirklich schnell sein. Versucht boost :: unordered_map aber ich kann es nicht mit Bereich Klasse (obwohl ich boost :: hash_value für Range-Objekte implementiert haben) zu arbeiten. Ein finden kehrt nichts (und Operator == nicht einmal während eines finden, die ich seltsam finden genannt wird)
Ideen?
Vielleicht ist Ihr Hash Buggy? 'operator ==' wird nur aufgerufen, sobald ein Element mit dem richtigen Hash gefunden wurde. – jalf
Hmm .. Ich denke ich weiß warum. Da unordered_map einen Hash-Wert verwendet, wird der Hash-Wert des Suchschlüssels (mit find verwendet) nur Einträge mit singulären Bereich (d. H. Von == bis) – Robert
Ihre Hash-Wert-Implementierung wäre nützlich. Haben Sie auch versucht, einen sortierten Vektor mit binärer Suche anstelle einer Karte zu verwenden? Diese haben normalerweise eine schnellere Suche (aber langsamere Inserts). –