Prüfen, ob ein std::string nur Whitespaces enthält.
-
Guten Abend,
wie im Titel erwähnt, will ich prüfen, ob ein
stringnur aus Whitespaces besteht. Momentan mache ich es so:bool only_whitespace(const string& str) { string::const_iterator it = find_if(begin(str),end(str),[](char c) { return c!=' '; }); return it==end(str); }Meine Frage ist nun, ob es noch eine elegantere C++-Lösung gibt?
Danke im Voraus.
-
all_of/any_of
-
314159265358979 schrieb:
all_of/any_of
Danke dir. Und hier noch die Lösung zu PIs Vorschlag für andere Personen.
bool only_whitespace(const string& str) { return all_of(begin(str),end(str),[](char c) { return c==' '; }); }Was ich an
all_ofaber blöd finde ist, dass für eine empty-rangetruezurückgegeben wird.
-
return !str.empty() && all_of(...);Allerdings: Wenn es dir nur um ' ' und nicht auch um andere Whitespaces geht, dürfte
return !str.empty() && str.find_first_not_of(' ') != std::string::npos;performanter sein.
-
all_of ist nur sinnvoll in Kombination mit isspace (was wohl auch gefragt sein dürfte), sonst ist das first_not_of geeigneter.
-
seldon schrieb:
return !str.empty() && all_of(...);Allerdings: Wenn es dir nur um ' ' und nicht auch um andere Whitespaces geht, dürfte
return !str.empty() && str.find_first_not_of(' ') != std::string::npos;performanter sein.
Wenn wir wirklich nur ein Zeichen haben und Höchstperformance gefragt ist, dann können wir sogar clevere reinterpret_casts auf den data()-Bereich des Strings machen und uns dann in ganzen Maschinenwörtern durch den String hangeln.
-
Das sollte eine Standardbibliothek insofern schön machen können, als dass in der Praxis (und das kann die Bibliothek dann intern wissen) &str[0] immer für alle Datentypen richtig ausgerichtet sein dürfte (als Rückgabe von new[] halt). Wobei...wird das von benutzerdefinierten Allokatoren eigentlich auch verlangt?
Wie dem auch sei, 4 bzw. 8 Byte auf einmal sollte man da durchnudeln können, und ein Paradekandidat für SSE ist es eigentlich auch. Ich bin etwas verwundert, dass GNUs libstdc++ nichts derartiges macht.
-
seldon schrieb:
Wie dem auch sei, 4 bzw. 8 Byte auf einmal sollte man da durchnudeln können, und ein Paradekandidat für SSE ist es eigentlich auch. Ich bin etwas verwundert, dass GNUs libstdc++ nichts derartiges macht.
Naja, ist schon eine ziemlich spezielle Optimierung, die man bei diesem Problem benutzen kann und sonst eher schwerlich. Außerdem ist das ein guter Einwand mit benutzerdefiniertem Allokator, da bin ich mir nicht sicher (und ich bin auch zu faul nachzugucken), ob die spezielle Anforderungen erfüllen müssen.
-
Ggf. behandelt man dann die ersten drei bis sieben Byte halt gesondert. Spannend wird es allerdings, wenn std::basic_string mit etwas anderem als std::char_traits<char> bzw. std::char_traits<wchar_t> konkretisiert wird.
-
seldon schrieb:
Ggf. behandelt man dann die ersten drei bis sieben Byte halt gesondert. Spannend wird es allerdings, wenn std::basic_string mit etwas anderem als std::char_traits<char> bzw. std::char_traits<wchar_t> konkretisiert wird.
Naja das liesse sich ja leicht über Spezialisierungen regeln.