Сначала о правильном написании:
// создаем экземпляр и назначаем
#include <iostream>
#include <list>
using namespace std;
int main() {
//Первый, через конструктор
int myints[] = { 44,77,22,11,12 };
list<int> myList(myints, myints + 5);
cout << "mylist contains:";
//переход
for (list<int>::iterator it = myList.begin(); it != myList.end(); ++it)
{
cout << " " << *it;
}
for (auto it = myList.begin(); it != myList.end();)
{
if (*it == 22) {
myList.erase(it++);
}
else
{
cout << " " << *it;
it++;
}
}
return 0;
}
Распространенные опечатки:
// Перекрестное удаление, это неправильный способ написания.
for (auto it = myList.begin(); it != myList.end(); it++)
{
if (*it == 11) {
myList.erase(it);
}
}
Когда container.erase(it) выполняется, первый элемент, удовлетворяющий условию, действительно удаляется, но указатель it в это время был удален, и он не указывает ни на какой элемент, поэтому он может остановиться только здесь, то есть Говорят, что приведенный выше код может правильно удалить только первый элемент, который удовлетворяет условию для контейнера связанного списка.Первое, о чем мы думаем для этой проблемы, — это сделать резервную копию указателя перед его удалением.