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

时间:2016-12-27 22:25:44

标签: c++ pointers vector iterator nullptr

我遇到了矢量迭代器问题。我在一些地方读过,检查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()。

3 个答案:

答案 0 :(得分:16)

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

  

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

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

答案 1 :(得分:3)

不,你不能检查NULL,因为它不是指针。返回并检查animalList.end()。只有当迭代器不等于end()时才能取消引用它。

答案 2 :(得分:2)

只需像这样查看

auto it = findInList( someInfo );

if ( it == animalList.end() ) std::cout << "not found";