Страницы

Поиск по вопросам

воскресенье, 15 марта 2020 г.

Ошибка выполнения при удалении элемента контейнера в цикле

#cpp #алгоритм #stl #vector #вектор


Код собирается нормально но при выполнении получаю ошибку доступа:

#include 
#include 
#include 

using namespace std;

int main(){
    vector v;

    v.push_back("-");
    v.push_back("+");
    v.push_back("-");

    auto it = v.begin();

    for (it; it != v.end(); it++)
        if (*it == "+"){
            v.erase(it); // сдесь ошибка выполнения
        }

    return 0;
}

    


Ответы

Ответ 1



После удаления элемента итераторы становятся не валидными. Правильно будет написать следующим образом (я заменил цикл for на while, так как вы итератор it объявили вне цикла, и цикл while в этом случае смотрится лучше. Хотя лучше использовать цикл for с объявлением итератора внутри цикла) while ( it != v.end() ) if (*it == "+"){ it = v.erase(it); } else { ++it; } Общий подход для такой задачи пишется в одну строчку #include #include #include //... v.erase( std::remove( v.begin(), v.end(), "+" ), v.end() ); Если хотите удалить только один элемент, то можно записать следующим образом: auto it = std::find( v.begin(), v.end(), "+" ); if ( it != v.end() ) v.erase( it );

Комментариев нет:

Отправить комментарий