Страницы

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

вторник, 4 июня 2019 г.

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

Код собирается нормально но при выполнении получаю ошибку доступа:
#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; }


Ответ

После удаления элемента итераторы становятся не валидными. Правильно будет написать следующим образом (я заменил цикл 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 );

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

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