Je veux rechercher une grande chaîne pour tous les emplacements d'une chaîne. P>
4 Réponses :
Tout simplement ici est la documentation. P> An Voici l'exemple pris à partir de cette documentation: P> utiliser std :: string :: recherche () code> qui retourne la position à laquelle la soustrine a été trouvée, ou
std :: string :: npos code> si aucun n'était trouvé.
// string::find
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string str ("There are two needles in this haystack with needles.");
string str2 ("needle");
size_t found;
// different member versions of find in the same order as above:
found=str.find(str2);
if (found!=string::npos)
cout << "first 'needle' found at: " << int(found) << endl;
found=str.find("needles are small",found+1,6);
if (found!=string::npos)
cout << "second 'needle' found at: " << int(found) << endl;
found=str.find("haystack");
if (found!=string::npos)
cout << "'haystack' also found at: " << int(found) << endl;
found=str.find('.');
if (found!=string::npos)
cout << "Period found at: " << int(found) << endl;
// let's replace the first needle:
str.replace(str.find(str2),str2.length(),"preposition");
cout << str << endl;
return 0;
}
@sehe: Il y en avait un dans la documentation liée (que j'ai maintenant recopié). Un peu trop tard apparemment;)
en utilisant EDIT FORT>: DOH! Merci pour la remarque, Nawaz! Mieux? P> P> std :: string :: trouver code>. Vous pouvez faire quelque chose comme:
C'est mieux. Mais maintenant, avez-vous besoin du si-ele code> à l'intérieur de la boucle?
Ha, gentil :) Voici ce qui se passe quand je suis toujours à moitié endormi: D Nope, je n'en ai pas besoin. Juste à la première fois, je pensais que sans cela, je me manquerais le dernier caractère, si le my_sub_string code> est juste une lettre qui est placée à la fin du
mystring code> . Merci encore!
Cela a l'air mieux que plus tôt ... +1
Les deux autres réponses sont correctes mais elles sont très lentes et ont une complexité O (N ^ 2). Mais il y a le Knuth-Morris-Pratt A > algorithme, qui trouve toutes les sous-chaînes de la complexité O (n). EDIT: strong> p> aussi, il y a un autre algorithme: la soi-disant "fonction z-fonction" avec O (n) complexité, mais je n'ai pas pu trouver une source anglaise pour cet algorithme (peut-être parce qu'il y a aussi un autre plus célèbre avec le même nom - la fonction Z de RIEMAN), donc je vais simplement mettre son code ici et expliquer ce que c'est. p>
hmm, ne pensez-vous pas que les écrivains de std :: string :: trouvent code> ont peut-être mis en œuvre KMP en dessous? En fait, avec l'avènement des nouvelles instructions SSE4.2, ce type d'optimisation peut déjà être disponible dans les fonctions de bas niveau (telles que
strtstr code> dans glibc) - et à moins que vous n'utilisiez les instructions de Votre propre code, très improbable que vous battez la performance de ces fonctions de niveau inférieur. Résultat final, sauf si vous pouvez prouver de manière empirique, c'est vraiment lent, ne réinventez pas ... M2C
Vous pouvez vous tester. Considérons Main_string = "A" (1000000 fois) + "B" + "A" (1000000 fois). et sous-chaîne = "A" (999999 fois). Utilisation de std :: String :: Recherche et le code de @kiril Kirov Votre programme fonctionnera 2-3 jours, mais celui-ci reviendra de manière imidement.
Vous voudrez peut-être aussi envisager d'utiliser le Boyer-Moore algorithme, il 's O (n) et fonctionne mieux avec une aiguille plus longue (sous-chaîne).
Il est un peu non sensible pour décrire des algorithmes de recherche de chaîne comme O (N) ou O (n * n) lorsqu'il y a réellement deux paramètres qui déterminent le temps d'exécution, n_haystack et n_needle. À peu près n'importe quel algorithme est O (n_haystack) lorsque N_Needle = 1. La plupart sont O (n_haystack * n_nedele) ou mieux, et vous pourrez peut-être assumer n_needle <= C.
Je vais ajouter une autre approche possible avec une autre approche avec Je trouve que ce parfois em> surperforms std :: Rechercher code>, fonctionne comme
std :: string :: Trouver code>, la différence est que Vous travaillez avec des itérateurs, comme:
std :: string :: trouve code>, esp. Si vous représentez votre chaîne en tant que
vecteur