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
pobiera ciąg szukać w obiektu wywołującego i (w tym przeciążenia) pozycję znaku, w którym do rozpoczęcia poszukiwań i zwraca pozycję wystąpienia łańcucha, lub string::npos
jeśli ciąg nie został znaleziony.
Zmienna start
rozpoczyna się od 0 (pierwszy znak) oraz w stanie pętli użyć start
powiedzieć find
gdzie zacząć szukać, a następnie przypisać wartość zwracaną find
do start
. Zwiększ liczbę wystąpień; teraz, gdy start
utrzymuje pozycję ciągu, możesz pominąć znaki to_find_occurrences_of.length()
i zacząć ponownie szukać.
drhirsch sprawia, że punkt, że jeśli
to_find_occurrences_of
zawiera powtarzające się sekwencje znaków, robiąc
start += to_find_occurrences_of.length()
może pominąć niektóre wystąpienia. Na przykład, jeśli
base_string
był
"ffff"
i
to_find_occurrences_of
był
"ff"
, to tylko 2 wystąpienia byłyby policzone, jeśli dodasz
to_find_occurrences_of.length()
do
start
. Jeśli chcesz tego uniknąć, dodać 1 zamiast
to_find_occurrences_of.length()
do
start
, w tym przykładzie, 3 zdarzenia byłyby liczone zamiast tylko 2.
@ BjörnPollex Usunięto tag # c-strings – DreamCodeer