我可以针对null检查C迭代器吗?

我在使用矢量迭代器时遇到了麻烦.我在一些地方读过,检查null迭代器是不可能的,检查迭代器的常用方法是在搜索后检查vector.end().例如:

vector< Animal* > animalList;

vector<Animal*>::iterator findInList(const type_info& type)
{
    // Loop through list of Animals, if Dog found, return iterator to it
}

auto it = findInList(typeid(Dog));
// With a pointer I can check if it's null, but with an iterator I have to check against animalList.end();

问题是容器可能是空的.使用迭代器,我不能返回null以指示容器为空或搜索失败.我可以返回vector :: end(),但cplusplus.com说:

If the container is empty, vector::end() function returns the same as vector::begin()

然后对于vector :: begin()它说:

If the container is empty, the returned iterator value shall not be dereferenced.

所以,如果我有一个空容器,vector :: end()和vector :: begin()指向同一个地方,我认为我不能取消引用它,我甚至不确定它是否指向已分配的内存.

编辑:感谢大家.当你迭代出来时,vector :: end()或vector :: begin()不要取消引用迭代器,我可以安全地检查vector :: end().

最佳答案
您不需要检查迭代器是否为null,因为它永远不会.您需要检查返回的迭代器是否与容器end()位置不同.如果是,您可以通过*它安全地取消引用迭代器.

If the container is empty, the returned iterator value shall not be dereferenced.
So if I have an empty container, vector::end() and vector::begin() point to the same place, I don’t think I can dereference it, and I’m not even sure it’s pointing to allocated memory.

不,检查是否(myIt!= container.end())它没有取消引用迭代器.迭代器取消引用是* myIt,这意味着获取迭代器指向的对象的值.检查来自同一容器的其他迭代器的迭代器总是安全的,取消引用迭代器而不指向容器元素是不安全的.

转载注明原文:我可以针对null检查C迭代器吗? - 代码日志