binary_search mit std::vector<std::string>
-
Hallo, ich habe folgendes Problem. Ich habe eine whitelist mit mehreren tausend Einträgen, die ich schnell durchsuchen muss.
Da die Suchfunktion (compare()) jedoch in manchen Situationen anders agieren soll, habe ich mich nicht für ein std::set entschieden, sondern einen std::vector, der, nachdem er sortiert wurde, mit dieser speziellen compare-Funktion durchsucht wird:bool __cdecl whitelist_compare(const std::string& str1, const std::string& str2) { std::string cpy1(str1); std::string cpy2(str2); std::transform(cpy1.begin(), cpy1.end(), cpy1.begin(), ::toupper); std::transform(cpy2.begin(), cpy2.end(), cpy2.begin(), ::toupper); size_t s = cpy1.length() - 1; if (cpy1.at(s) == '.') { int result = cpy1.compare(0, s, cpy2, 0, s); if (result == 0) { LOG(Logging::nDebug, L"cpy1.compare: SCHEMA FOUND IN WHITELIST"); } return result > 0; } return (cpy1 > cpy2); }Die Suche soll case-insensitive einen Namen, sagen wir mal "SCOTT.EMP", in der Whitelist suchen.
In der Whitelist finden sich folgende Einträge:system.
sys.
scott.
bla.blub
BLUB1Einträge in der Whitelist, die auf einen Punkt enden, sind Schemata, wenn also nach "SCOTT.EMP" gesucht wird und "SCOTT." in der Whitelist enthalten ist, dann soll die binäre Suche matchen.
Aber leider funktioniert der obige Code nicht, zumindest nicht immer. Anscheinend kommt es darauf an, wie viele Einträge in der Whitelist sind.
Was muss ich denn zurück liefern, wenn die Zeile
int result = cpy1.compare(0, s, cpy2, 0, s);gematched hat? True oder false? So wie ich es verstanden hatte, muss die compare()-Funktion true zurückliefern, wenn str1 größer str2 ist, ansonsten false.
Jedoch scheint dies nicht zu klappen.Ich hatte so eine Funktion schon einmal mit der C-Funktion bsearch() erstellt, jedoch ging es da ohne Probleme. bsearch() erwartet von der compare() Funktion aber auch einen Wert kleiner, gleich oder größer null. binary_search() will jedoch nur true oder false.
Hat jemand eine Idee, was hier falsch läuft?
Achja, bevor die Frage aufkommt: Der Vektor ist sortiert
sort(wlist.begin(), wlist.end())Hier nochmal die binary_search()-Funktion im Code, falls es was bringt:
bool result = false; std::string searchStr(TestString); ListEntries& whitelist = d->configReader->whitelist(); result = std::binary_search(whitelist.begin(), whitelist.end(), searchStr, helperutils::whitelist_compare);
-
Da die Suchfunktion (compare()) jedoch in manchen Situationen anders agieren soll
Deine Sortierpraedikat muss mit deinem Suchpraedikat kompatibel sein. Das ist sie ganz und gar nicht.