cstring-array und std::lower_bound
-
hi leute
hab ein cstring-array:
const char *values[] = {"value1", "value2", "value3", "value4"};die strings sind sortiert. nun moechte ich testen ob ein bestimmter string in dem array vorhanden ist:
const char *first = param_names[0]; const char *last = (param_names[0] + (count * sizeof(const char*))); const char *needle = "value2"; auto test = [](const char *lhv, const char *rhv) noexcept -> bool { return strcmp(lhv, rhv) < 0; }; auto it = std::lower_bound(first, last, needle, test); bool exists = (it != last && strcmp(it, needle));wie mach ich das richtig ? so funktioniert das ja nicht.
Meep Meep
-
bool exists = (it != last && strcmp(it, needle)); ^^^^^^^^^^^^^^^^^^Sollte das nicht gerade ein Vergleich auf Null sein?
-
Arcoth schrieb:
bool exists = (it != last && strcmp(it, needle)); ^^^^^^^^^^^^^^^^^^Sollte das nicht gerade ein Vergleich auf Null sein?
inwiefern auf null vergleichen ?
erster vergleich sind die 2 iteratoren. wenn it == end existiert der string nicht. der 2te vergleich ist dann der string selber der von lower_bound zurueck gegeben wird. wenn it != end dann bedeutet das ja nicht das er den string gefunden hat. oder was genau meinst du ?
-
Und was liefert strcmp im Fall gefunden?
-
so, bin einen schritt weiter. hab jetzt:
int count = sizeof(param_names) / sizeof(char*); const char **first = param_names; const char **last = first + count; const char *needle = "value2"; auto test = [](const char *lhv, const char *rhv) noexcept -> bool { return strcmp(lhv, rhv) < 0; // (1) }; auto it = std::lower_bound(first, last, t_name.c_str(), test); return *it != *last && strcmp(needle, *it) == 0;wenn ich nun in zeile (1) einen breakpoint setze, kann ich die vergleiche mitverfolgen. aber die passen nicht er geht immer richtung array ende und dann bekomm ich am ende den last pointer els ergebnis zurueck. als wenn beim vergleich in der lampda funktion was nicht stimmen wuerde
-
hat sich erledigt. stimmt schon so. ich hatte bei den strings ein paat dabei die ein kleines L als anfangsbuchstaben hatten und ich dachte das waere ein großes I.
war also nicht sortiert. mit richtiger sortierung funktioniert es.