Ответ 1
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
берет строку для поиска в вызывающем объекте и (в этой перегрузке) позицию символа, в которой следует начинать поиск, и возвращает позицию вхождения строки, или string::npos
, если строка не найден.
Переменная start
начинается с 0 (первый символ) и в условии цикла, вы используете start
, чтобы сообщить find
, где начать искать, затем присвойте возвращаемое значение find
в start
. Увеличьте количество случаев; теперь, когда start
содержит позицию строки, вы можете пропустить символы to_find_occurrences_of.length()
1 и начать искать снова.
1 drhirsch делает вывод, что если
to_find_occurrences_of
содержит повторяющуюся последовательность символов, выполнение start += to_find_occurrences_of.length()
может пропустить некоторые вхождения. Например, если base_string
был "ffff"
и to_find_occurrences_of
был "ff"
, тогда только 2 вхождения будут учитываться, если вы добавите to_find_occurrences_of.length()
в start
. Если вы хотите этого избежать, добавьте 1 вместо to_find_occurrences_of.length()
в start
, и в этом примере три вхождения будут считаться вместо двух.