Оба цикла неверны, потому что после вставки элемента в вектор итератор mid становится недействительным. Память, выделенная для элементов вектора, может быть перераспределена.
Чтобы добиться того, что вы пытаетесь сделать, лучше ввести количество итераций, например,
auto n = v.size() / 2;
for ( auto iter = v.begin(); n != 0; n-- )
{
if( *iter == 5 )
{
iter = v.insert(iter, 0);
iter++;
}
iter++;
}
Вот демонстрационная программа.
#include <iostream>
#include <vector>
int main()
{
std::vector <int> v = { 1, 5, 5, 5, 5, 2, 3, 4, 5, 6, 7 };
for ( const auto &item : v ) std::cout << item << ' ';
std::cout << '\n';
auto n = v.size() / 2;
for ( auto it = v.begin(); n != 0; n-- )
{
if ( *it == 5 )
{
it = v.insert( it, 0 );
++it;
}
++it;
}
for ( const auto &item : v ) std::cout << item << ' ';
std::cout << '\n';
return 0;
}
Вывод программы:
1 5 5 5 5 2 3 4 5 6 7
1 0 5 0 5 0 5 0 5 2 3 4 5 6 7
Или l oop может выглядеть как
for ( auto it = v.begin(); n--; ++it )
{
if ( *it == 5 )
{
it = v.insert( it, 0 );
++it;
}
}