Можете ли вы удалить элементы из std :: forward_list во время итерации по нему? - PullRequest
2 голосов
/ 07 августа 2020

Я пытаюсь перебирать forward_list вручную и удалять определенные элементы. Мой вопрос по сути такой же, как этот , но с оговоркой forward_list.

Следующий код (, например, только ), несмотря на то, что я не пересматривал before после вызова «стереть после», не работает (производит бесконечный мусор).

#include <iostream>
#include <forward_list>

typedef std::forward_list<int>::iterator IT;

int main()
{
    std::forward_list<int> m{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    IT before = m.before_begin();

    for ( IT it = m.begin(); it != m.end(); ++it )
    {
        std::cout << *it;

        if ( *it % 2 == 0 )
        {
            m.erase_after( before );
        }

        before = it;
    }

    for( int i : m )
    {
        std::cout << i;
    }
}

1 Ответ

2 голосов
/ 07 августа 2020

Проблема в том, что после erase_after итератор к удаленному элементу, т.е. it становится недействительным; выполнение ++it позже приводит к UB.

erase_after возвращает итератор к элементу, следующему за удаленным, вы можете назначить его it. (И переместите ++it в оператор for, чтобы управлять им вручную.)

for ( IT it = m.begin(); it != m.end(); )
{
    std::cout << *it;

    if ( *it % 2 == 0 )
    {
        it = m.erase_after( before );
    } 
    else
    {
        before = it;
        ++it;
    }

}

LIVE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...