Есть последовательность из чисел, надо перед каждым отрицательным вставить 0
Я записал начальную последовательность в vector
и потом хотел проставить в цикле 0 перед отрицательными, используя итератор, но мне выдало "can't increment vector iterator past end"
int main()
{
vector<int> v;
vector<int>::iterator p;
int x;
//запись последовательность в вектор
do
{
cin >> x;
v.push_back(x);
} while(x != 0);
//вставка 0
for (p = v.begin(); p != v.end(); p++)
{
if (*p < 0)
v.insert(p, 0);
}
}
Итераторы в общем случае становятся не валидными после позиции вставки элемента. А если происходит перераспределение памяти у вектора, то и итераторы до позиции вставки также становятся не валидными, что имеет место в случае вашего цикла, который в противном случае может даже стать бесконечным.
Если вы еще пока не используете алгоритмы, то ниже приведена демонстрационная программа, которая показывает, как можно выполнить поставленную задачу, используя только циклы.
#include <iostream>
#include <vector>
#include <iterator>
int main()
{
std::vector<int> v = { 1, -1, 2, 3, -4 };
for ( const auto &item : v ) std::cout << item << ' ';
std::cout << '\n';
size_t n = 0;
for ( const auto &item : v ) n += item < 0;
v.reserve( v.size() + n );
for ( auto it = std::begin( v ); it != std::end( v ); ++it )
{
if ( *it < 0 ) ++( it = v.insert( it, 0 ) );
}
for ( const auto &item : v ) std::cout << item << ' ';
std::cout << '\n';
return 0;
}
Вывод программы на консоль:
1 -1 2 3 -4
1 0 -1 2 3 0 -4
Если вам предложение
if ( *it < 0 ) ++( it = v.insert( it, 0 ) );
кажется слишком вычурным, то вы можете заменить его на
if ( *it < 0 )
{
it = v.insert( it, 0 );
++it;
}
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход