Можно ли вставлять элементы в vector в цикле

113
05 января 2020, 15:30

Есть последовательность из чисел, надо перед каждым отрицательным вставить 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);
    }
}
Answer 1

Итераторы в общем случае становятся не валидными после позиции вставки элемента. А если происходит перераспределение памяти у вектора, то и итераторы до позиции вставки также становятся не валидными, что имеет место в случае вашего цикла, который в противном случае может даже стать бесконечным.

Если вы еще пока не используете алгоритмы, то ниже приведена демонстрационная программа, которая показывает, как можно выполнить поставленную задачу, используя только циклы.

#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;
}
READ ALSO
Декомпрессор gzip на C++, библиотека zlib.h

Декомпрессор gzip на C++, библиотека zlib.h

Доброго времени суток!

157
Как записать wchar_t в файл?

Как записать wchar_t в файл?

Вывод в терминал я понял как делать

134
Как выбрать объект через form:select?

Как выбрать объект через form:select?

Имеются такие классы

128