Я не буду упоминать ошибки, упомянутые в комментариях.
Я бы не пытался манипулировать той же самой строкой, в которой выполняется поиск.
В частности, для цикла for на основе диапазона, в котором будут использоваться итераторы. Итераторы могут быть аннулированы путем изменения базовой коллекции, часто совпадая с динамическим выделением памяти (пере). Я не знаю, как строковые итераторы работают на моей голове, но я бы предположил, что, когда вы растите строку, вы лишаете законной силы ваши итераторы.
Я бы создал вторую строку, просканировал первую строку, чтобы определить количество гласных, и сразу же зарезервировал это место. Это требует повторения первой строки дважды, но вы должны вызывать выделение кучи не более одного раза.
Затем просто переберите первую строку и заполните вторую.
#include <iostream>
#include <string>
#include <algorithm>
bool is_vowel(char c)
{
return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}
int main()
{
const std::string vowel_postfix = "ob";
std::string in, out;
std::cin >> in;
auto vowel_count = std::count_if(in.begin(), in.end(), is_vowel);
out.reserve(in.length() + vowel_count * 2);
for (char c : in) {
out.push_back(c);
if (is_vowel(c))
out.insert(out.length(), vowel_postfix);
}
std::cout << out << std::endl;
}