Vergleichsfunktion bei set, die zweite
-
Hallo,
ich hab ein String-Set mit eigener Vergleichsfunktion, in dieses Set sollen spezielle String (siehe Kommentar im Source), der Vergleich soll aber nicht nach dem ganzen String erfolgen, sondern nur nach dem ersten Teil.
// Die Strings sehen so aus: // "03423789;AUFTRAG;undosweiter...." // "034;MAHNUNG;undsoweiter...." // "034;AUFTRAG;undsoweiter...." // und sortiert werden soll nach der Nummer vor dem ersten Semikolon class comp : public binary_function<bool, string, string> { public: bool operator()(const string& left,const string& right) const { string s1 = strtok((char *)left.c_str(), ";"); string s2 = strtok((char *)right.c_str(), ";"); return s1 < s2; } }; set<string, comp > ss;Das funktioniert zwar, nur das jetzt eigentlich unterschiedliche Strings, wie der zweite und dritte im Source oben als gleich behandlet werden, und demzufolge der letzte nicht mehr eingefügt wird.
Was kann man da tun?
-
Ok, ich schieb es drauf, das es Montag morgen ist und mein Hirn noch Wochenende tut

class comp : public binary_function<bool, string, string> { public: bool operator()(const string& left,const string& right) const { string s1 = strtok((char *)left.c_str(), ";"); string s2 = strtok((char *)right.c_str(), ";"); if(s1 == s2) return (left < right); return s1 < s2; } };und schon tut er, was er soll

-
man: strtok ersetzt das gefundene Trennzeichen durch '\0' und liefert einen Pointer auf das erste Zeichen dahinter. Aber wie der mit string::c_str() zusammenarbeitet, ist die andere Frage - da solltest du besser die string-eigenen Methoden verwenden (find() und substr()).
PS: Und ein Cast von const char* nach char* ist sowieso gefährlich.
-
Postman schrieb:
strtok((char *)left.c_str(), ";");
Aua, aua. Meinst du nicht, dass einen Sinn hat, dass c_str const zurückgibt?
-
Postman schrieb:
Ok, ich schieb es drauf, das es Montag morgen ist und mein Hirn noch Wochenende tut

class comp : public binary_function<bool, string, string> { public: bool operator()(const string& left,const string& right) const { string s1 = strtok((char *)left.c_str(), ";"); string s2 = strtok((char *)right.c_str(), ";"); if(s1 == s2) return (left < right); return s1 < s2; } };und schon tut er, was er soll

Da bleibt aber von Deinem Substringvergleich nichts mehr übrig. Wenn die Zeichen bis zum 1. Semikolon gleich sind, dann vergleiche den ganzen String. Ansonsten vergleiche den Teil bis zum Semikolon. Das geht einfacher mit:
bool operator()(const string& left,const string& right) const { return left < right; }