Ich habe eine Variable vom Typ std::string
. Ich möchte überprüfen, ob es eine bestimmte enthält std::string
. Wie würde ich das machen?
Gibt es eine Funktion, die true zurückgibt, wenn die Zeichenfolge gefunden wird, und false, wenn dies nicht der Fall ist?
std::basic_string::contains
zur stdlib hinzuzufügen.Antworten:
Verwenden Sie
std::string::find
wie folgt:Hinweis: "gefunden!" wird gedruckt, wenn
s2
es sich um eine Teilzeichenfolge vons1
beiden handelts1
unds2
vom Typ iststd::string
.quelle
Sie können versuchen, die
find
Funktion zu verwenden:quelle
Eigentlich können Sie versuchen, die Boost-Bibliothek zu verwenden. Ich denke, std :: string bietet nicht genügend Methoden, um alle gängigen String-Operationen auszuführen. Beim Boost können Sie einfach Folgendes verwenden
boost::algorithm::contains
:quelle
find
Methode für genau die betreffende Aufgabe. Es ist nicht erforderlich, eine Bibliotheksabhängigkeit einzuführen.contains
iststd::contains
oder nichtboost::contains
, was ein erheblicher Nachteil zu sein scheint. Ich denke, std :: enthält derzeit nicht, aber ich bin nicht sicher, ob es vernünftig ist anzunehmen, dass der Leser alles gespeichert hat, was in std enthalten ist. Undstd::contains
könnte sehr gut in einer zukünftigen Version von c ++ existieren, die dieses Programm brechen würde.Sie können dies versuchen
quelle
Für den Fall, dass die Funktionalität für Ihr System kritisch ist, ist es tatsächlich vorteilhaft, eine alte
strstr
Methode zu verwenden. Diestd::search
Methodealgorithm
ist so langsam wie möglich. Ich vermute, dass das Erstellen dieser Iteratoren viel Zeit in Anspruch nimmt.Der Code, mit dem ich das Ganze zeitlich festgelegt habe, ist
Hier generiere ich zufällig
haystacks
und suche in ihnen dieneedle
. Die Anzahl der Heuhaufen wird festgelegt, aber die Länge der Saiten in jedem Heuhaufen wird von 10 am Anfang auf 10240 am Ende erhöht. Die meiste Zeit verbringt das Programm damit, zufällige Zeichenfolgen zu generieren, aber das ist zu erwarten.Die Ausgabe ist:
quelle
Wenn Sie keine Standardbibliotheksfunktionen verwenden möchten, finden Sie unten eine Lösung.
quelle
CheckSubstring(std::string firstString, std::string secondString)
Deep kopiert beide Zeichenfolgen, die an die Funktion übergeben wurden, was teuer ist, insbesondere für längere Zeichenfolgen, die Heap-Zuweisungen erfordern. Ferner sagen Sie rufenCheckSubstring("XYZab", "ab\0\0")
- diewhile
Schleife wird am Ende Vergleicha
zua
,b
umb
die implizite NUL am Ende der ersten Zeichenfolge an den expliziten NUL in den zweiten, dann wird es über die ersten String-Puffer zu lesen, nicht definiertes Verhalten aufweist. Verwenden Sie zumfor (...
Korrigieren i <= firstString.size () - secondString (). Size (); ...) `.Wenn die Größe der Zeichenfolgen relativ groß ist (Hunderte von Bytes oder mehr) und c ++ 17 verfügbar ist, können Sie den Boyer-Moore-Horspool-Sucher verwenden (Beispiel von cppreference.com):
quelle
bool contains(const std::string& haystack, const std::string& needle)
. Heutzutage bieten sie eine Reihe von Puzzleteilen an, die nach einigen obskuren Autoren obskurer Papiere benannt sind, damit sie eher wie Informatik aussehen ...Sie können auch den System-Namespace verwenden. Dann können Sie die Methode includes verwenden.
quelle
Dies ist eine einfache Funktion
quelle
quelle
using
nur die erforderlichen Funktionen verwenden und nicht den gesamten Namespace in den globalen Bereich kopieren. Was den @ SᴀᴍOnᴇᴌᴀ-Kommentar betrifft, denke ich, dass der Benutzer die Kommentare in Ihrem Code nicht gelesen hat.Aus so vielen Antworten auf dieser Website habe ich keine klare Antwort herausgefunden, also habe ich in 5-10 Minuten die Antwort selbst herausgefunden. Dies kann jedoch in zwei Fällen erfolgen:
Nehmen wir also an, wir suchen nach der Teilzeichenfolge "cd" in der Zeichenfolge "abcde" und verwenden die einfachste in C ++ integrierte Funktion " substr"
für 1:
für 2:
quelle
Wir können stattdessen diese Methode verwenden. Nur ein Beispiel aus meinen Projekten. Beziehen Sie sich auf den Code. Einige Extras sind ebenfalls enthalten.
Schauen Sie sich die if-Anweisungen an!
quelle