任何 std 容器的擦除函数的参数类型(正如您在问题中列出的那样,即它是否来自向量、列表、双端队列......)始终是该容器的迭代器。
这个函数使用第一个给定的迭代器从容器中排除这个迭代器指向的元素,甚至是后面的元素。一些容器只擦除一个迭代器的一个元素,而另一些容器则擦除一个迭代器之后的所有元素(包括该迭代器指向的元素)直到容器的末尾。如果擦除函数接收到两个迭代器,则每个迭代器指向的两个元素都从容器中擦除,它们之间的所有其余元素也从容器中擦除,但关键是传递给擦除的每个迭代器任何 std 容器的功能都会失效!还有:
每个指向某个已从容器中删除的元素的迭代器都变得无效,但它没有通过容器的末尾!
这意味着指向某个已从容器中删除的元素的迭代器无法与 container.end() 进行比较。这个迭代器是无效的,因此它是不可解引用的,即不能使用 * 和 -> 操作符,它也不能递增,即不能使用 ++ 操作符,它也不能递减,即不能使用运营商。
也没有可比性!!!IE 你甚至不能使用 == 和 != 运算符
实际上,您不能使用在 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".
}
在我将它发布到那里之前,我已经测试过这个功能,发现这个功能对我有用。
我非常希望我已经完全回答了您的问题,也对您有很大帮助!