浅谈std::find( 返回值

此问题源于某次查询数组中的对象时,错写成了从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。

所以,在这里以自身的教训告诫大家,知其然要知其所以然,不能因为惯用就不去过多了解,经常使用的东西就是要去了解学习原理,才能避免一些基础又不常见的问题

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值