Один из основных способов понять сложный код - попытаться упростить его. Это также помогает узнать, что делают задействованные функции, поэтому полезно прочитать ссылку на std::string::find
.
Прежде всего, давайте пропустим тело и сконцентрируемся только на l * Сама 1091 *:
for (size_t pos = 0; (pos = s.find(t, pos)) != string::npos;) {
}
Все циклы for
можно рассматривать как while
l oop, а циклы while
могут быть несколько проще для понимания и отслеживания, поэтому мы конвертируем их в такой while
l oop:
size_t pos = 0;
while (pos = s.find(t, pos)) != string::npos)
{
}
Это может не сильно помочь, так как это условие, которое, скорее всего, трудно понять, поэтому мы упростим и это:
size_t pos = 0;
pos = s.find(t, pos);
while (pos != string::npos)
{
pos = s.find(t, pos);
}
Инициализация pos
может быть еще более упрощена:
size_t pos = s.find(t);
while (pos != string::npos)
{
pos = s.find(t, pos);
}
Теперь сам l oop настолько прост, насколько это возможно, и, глядя на него, мы видим, что в основном попытаться найти подстроку t
внутри строки s
. L oop продолжается до тех пор, пока подстрока t
находится внутри s
.
Теперь, когда мы деконструировали сам l oop, давайте посмотрим на l oop -тела и что он делает:
s[pos + t.length() / 2] = '?';
r.push_back(pos + t.length() / 2);
Прежде всего давайте вытянем общее подвыражение во временную переменную:
auto new_pos = pos + t.length() / 2;
s[new_pos] = '?';
r.push_back(new_pos);
Первый оператор
s[new_pos] = '?';
заменяет средний символ подстроки t
внутри s
на символ '?'
.
Второй оператор
r.push_back(new_pos);
толкает положение '?'
в векторе r
.
Теперь, наконец, мы помещаем внутренний l oop (объясненный выше) в контекст внешнего l oop:
for (string t: {"twone", "one", "two"})
Это основанный на диапазоне for
l oop, который перебирает все элементы в контейнере с правой стороны :
. То есть l oop будет повторяться три раза, при этом t
будет равно "twone"
, "one"
и "two"
в этом порядке.
Таким образом, циклы будут искать "twone"
, "one"
и "two"
внутри строки s
, замените средний символ подстрок ("twone"
, "one"
и "two"
) внутри s
одним '?'
символом и pu sh положение этого '?'
символа в векторе r.
Например, если входное значение в s
равно "someone with the number two"
, то результатом будет строка "someo?e with the number t?o"
и вектор r
должен содержать значения 5
и 25
(которые будут напечатаны как 6
и 26
из-за + 1
).
Вот пример shoing именно это.