Тип параметров функции стирания любого стандартного контейнера (как вы указали в своем вопросе, т. Е. Является ли он вектором, списком, декой ...): всегда итератор этого контейнера только .
Эта функция использует первый заданный итератор, чтобы исключить из контейнера элемент, на который указывает этот итератор, и даже последующие. Некоторые контейнеры удаляют только один элемент для одного итератора, а некоторые другие контейнеры стирают все элементы, за которыми следует один итератор (включая элемент, указанный этим итератором) до конца контейнера. Если функция удаления получает два итератора, то два элемента, на которые указывает каждый итератор, стираются из контейнера, а все остальные между ними также стираются из контейнера, , но суть в том, что каждый итератор то, что передается в функцию стирания любого стандартного контейнера, становится недействительным! Также
Каждый итератор, который указывал на какой-либо элемент, который был удален из контейнера, становится недействительным, но не проходит через конец контейнера!
Это означает, что итератор, который указывал на какой-либо элемент, который был удален из контейнера, не может сравниваться с container.end ().
Этот итератор недопустим и поэтому не может быть разыменован, т. Е. Вы не можете использовать ни операторы *, ни ->, он также не является инкрементным, т.е. вы не можете использовать оператор ++, и он также не является декремментируемым, т.е. вы не можете использовать оператор -.
Это тоже несопоставимо !!! И.Е. Вы даже не можете использовать ни ==, ни! = операторы
На самом деле вы не можете использовать любой оператор, который объявлен и определен в итераторе std.
Вы не можете ничего сделать с этим итератором, как нулевой указатель.
Выполнение чего-либо с недопустимым итератором немедленно останавливает программу и даже вызывает сбой программы и появляется диалоговое окно подтверждения. Невозможно продолжить программу независимо от того, какие опции вы выбираете, какие кнопки нажимаете. Вы можете просто завершить программу и процесс, нажав кнопку Прервать.
Вы больше ничего не сделаете с недопустимым итератором, если только вы не можете либо установить его в начало контейнера, либо просто проигнорировать его.
Но прежде чем вы решите, что делать с итератором, сначала вы должны узнать, является ли этот итератор недействительным или нет, если вы вызываете функцию стирания используемого вами контейнера.
Я сделал функцию, которая проверяет, тестирует, знает и возвращает истину, является ли данный итератор недействительным или нет. Вы можете использовать функцию memcpy для получения состояния любого объекта, элемента, структуры, класса и т. Д., И, конечно, мы всегда сначала используем функцию memset, чтобы очистить или очистить новый буфер, структуру, класс или любой объект или элемент. :
bool IsNull(list<int>::iterator& i) //In your example, you have used list<int>, but if your container is not list, then you have to change this parameter to the type of the container you are using, if it is either a vector or deque, and also the type of the element inside the container if necessary.
{
byte buffer[sizeof(i)];
memset(buffer, 0, sizeof(i));
memcpy(buffer, &i, sizeof(i));
return *buffer == 0; //I found that the size of any iterator is 12 bytes long. I also found that if the first byte of the iterator that I copy to the buffer is zero, then the iterator is invalid. Otherwise it is valid. I like to call invalid iterators also as "null iterators".
}
Я уже тестировал эту функцию, прежде чем опубликовать ее там, и обнаружил, что эта функция работает для меня.
Я очень надеюсь, что полностью ответил на ваш вопрос и также очень помог вам!