int occurrences = 0;
string::size_type start = 0;
while ((start = base_string.find(to_find_occurrences_of, start)) != string::npos) {
++occurrences;
start += to_find_occurrences_of.length(); // see the note
}
string::find
prende una stringa da cercare nell'oggetto invocando e (in questo sovraccarico) una posizione di carattere in cui per iniziare la ricerca, e restituisce la posizione della occorrenza della stringa, o string::npos
se la stringa non è stata trovata.
La variabile start
parte da 0 (il primo carattere) e nella condizione del ciclo, si utilizza start
dire find
dove iniziare a cercare, quindi assegnare il valore di ritorno di find
a start
. Incrementa il conteggio delle occorrenze; ora che start
mantiene la posizione della stringa, puoi saltare i caratteri to_find_occurrences_of.length()
e ricominciare a guardare.
drhirsch fa il punto che se
to_find_occurrences_of
contiene una sequenza ripetuta di caratteri, facendo
start += to_find_occurrences_of.length()
può saltare alcuni eventi. Ad esempio, se
base_string
era
"ffff"
e
to_find_occurrences_of
era
"ff"
, allora si contano solo 2 occorrenze se si aggiunge
to_find_occurrences_of.length()
a
start
. Se si vuole evitare che, aggiungere 1 invece di
to_find_occurrences_of.length()
-
start
, e in questo esempio, 3 occorrenze sarebbero contati invece di 2.
fonte
2011-12-23 09:20:26
@ BjörnPollex rimosso il tag # c-strings – DreamCodeer