Тип параметров функции удаления любого станд контейнера (как вы перечислили в своем вопросе, то ли это из вектора, список, дека ...) является всегда итератор этого контейнера только.
Эта функция использует первый заданный итератор, чтобы исключить из контейнера элемент, на который указывает этот итератор, и даже те, которые следуют за ним. Некоторые контейнеры стирают только один элемент для одного итератора, а некоторые другие контейнеры стирают все элементы, за которыми следует один итератор (включая элемент, указанный этим итератором), до конца контейнера.Если функция стирания получает два итератора, то два элемента, обозначенные каждым итератором, удаляются из контейнера, а все остальные между ними стираются также из контейнера, , но дело в том, что каждый итератор, который передается функция стирания любого std-контейнера становится недействительной! Также:
Каждый итератор, который указывает на какой-то элемент, который был стерт из контейнера теряет силу, но он не пропускает конец контейнера!
Это означает, что итератор, указывающий на какой-либо элемент, который был удален из контейнера, не может сравниться с container.end(). Этот итератор недействителен, и поэтому он не является разыменованным, т. Е. Вы не можете использовать ни операторы * nor ->, но также не увеличивать, т. Е. Вы не можете использовать оператор ++, а также не уменьшаться, т. Е. Вы не можете используйте оператор -.
Это также не сопоставимо !!! И.Е. вы не можете даже использовать ни == nor! = operator
Фактически вы не можете использовать какой-либо оператор, который объявлен и определен в итераторе std. Вы не можете ничего сделать с этим итератором, как нулевой указатель.
Выполнение чего-либо с помощью недействительного итератора немедленно останавливает программу и даже вызывает сбой программы и появляется диалоговое окно подтверждения. Невозможно продолжить программу независимо от того, какие параметры вы выберете, какие кнопки вы нажимаете. Вы можете просто завершить программу и процесс, нажав кнопку «Отмена».
Вы ничего не делаете с недопустимым итератором, если только вы не можете установить его в начале контейнера или просто игнорировать его.
Но прежде чем вы решите, что делать с итератором, сначала вы должны знать, является ли этот итератор недействительным или нет, если вы вызываете функцию стирания используемого вами контейнера.
Я сделал одну функцию, которая проверяет, проверяет, знает и возвращает true, является ли данный итератор недействительным или нет. Вы можете использовать функцию 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".
}
Я уже тестировал эту функцию, прежде чем отправил ее туда и обнаружил, что эта функция работает на меня.
Я очень надеюсь, что я полностью ответил на ваш вопрос, а также очень помог вам!
В C++, когда вы просто изменяете итератор и не используете значение, вы всегда должны использовать '++ itd'' 'itd ++'. –
После просмотра вашего нового примера кода обратите внимание, что методы стирания STL возвращают следующий итератор, который является допустимым итератором (хотя он может быть итератором конца). Поэтому, чтобы помочь сохранить его, вы можете сделать это: if (something) { itd = l.erase (itd); } –
Mmm ... Я вижу ... – huff