C++ 我能查一下C++;针对null的迭代器?

C++ 我能查一下C++;针对null的迭代器?,c++,pointers,vector,iterator,nullptr,C++,Pointers,Vector,Iterator,Nullptr,向量迭代器有问题。我在一些地方读到过,检查空迭代器是不可能的,检查迭代器的通常方法是在搜索后根据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

向量迭代器有问题。我在一些地方读到过,检查空迭代器是不可能的,检查迭代器的通常方法是在搜索后根据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();
然后对于vector::begin()它说:

因此,如果我有一个空容器,vector::end()和vector::begin()指向同一个位置,我认为我无法取消对它的引用,而且我甚至不确定它是否指向已分配的内存


编辑:谢谢大家。由于您已经进行了迭代,vector::end()或vector::begin()不取消对迭代器的引用,我可以安全地检查vector::end()。

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

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

如果容器为空,则返回的迭代器值不应被取消引用。 因此,如果我有一个空容器,vector::end()和vector::begin()指向同一个位置,我认为我无法取消对它的引用,而且我甚至不确定它是否指向已分配的内存

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

只需这样检查即可

auto it = findInList( someInfo );

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

if(it==animalList.end())std::无法为空向量返回迭代器。当调用方在迭代器上循环时,循环将立即结束,并且它们永远不会取消对迭代器的引用。您是否试图避免公开内部使用的容器,因此,在为用户提供一种方法来对照容器本身的
结尾检查返回值时,他们犹豫不决?迭代器不是指针。“因此,如果我有一个空容器……我不认为我可以取消引用它。”如果您返回的指针可能为空,情况也会如此。@jaggedSpire,现在必须如此。我希望函数能尽可能多地处理。我想从我理解的答案中,我可以得到与vector::end()相同的行为检查,也就是说,与返回指针和检查nullptr相同。啊,我明白了我的误解。根据.end()检查迭代器不会取消引用,谢谢。@TitoneMaurice如果我帮助将问题标记为已删除,其他人可以在google索引中看到它,并且不会显示在未删除的问题列表上。谢谢。“将迭代器检查到其他迭代器总是安全的”哦,不,迭代器必须是有效的(这包括末尾的一个),并且它们必须引用同一个容器。@LightnessRacesinOrbit更新了anwser,提供了关于同一个容器的信息。任何stl算法都不会返回“结束后一个”迭代器。它将返回end()。用户必须手动增加这样的迭代器,如果dev想伤害自己,他总会找到一种方法:)谢谢你指出这一点。@paweldac:end()是超过end迭代器的迭代器。这不是好的样式。您已经在名为
findInList
的函数后面抽象出了容器,但是现在您必须立即打破这种抽象,并直接与容器进行比较。首先使用
.find
,或者找到另一种方法来表示未找到的情况。
If the container is empty, the returned iterator value shall not be dereferenced.
auto it = findInList( someInfo );

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