此问题源于某次查询数组中的对象时,错写成了从begin查到begin。
auto pItr = std::find(eles.begin(), eles.begin(), pEle);
pEle大概位于eles中间,按照之前的理解(个人误解),这样从begin查询到begin,那应该是查询不到的,查询不到应该返回end迭代器(注意此句是错误理解)。
但下面的代码居然拿到了eles的第一个元素,然后误对第一个元素进行了某处理
// 上文代码
auto pItr = std::find(eles.begin(), eles.begin(), pEle);
// 判断是否查到指定元素,查到则对元素做某处理
if (pItr == eles.end())
return ;
// doing something...
是的,InputIterator find (InputIterator first, InputIterator last, const T& value);这个函数在查到value时返回的是指向value的迭代器,当没有查到时返回的是指向last的迭代器,而不是一定返回容器的end,只不过我们在大部分时间使用的时候都是在整个容器中查找。比如当我们把指向容器中间元素的迭代器pMidItr作为last传进去时,当没有查找到指定元素时,实则返回的是指向容器中间元素的迭代器pMidItr;而我们大部分时间都是把容器的end当做last传进去,所以就容易形成一个假象:当没有查找到时返回容器的end。
所以,在这里以自身的教训告诫大家,知其然要知其所以然,不能因为惯用就不去过多了解,经常使用的东西就是要去了解学习原理,才能避免一些基础又不常见的问题