find_first_of用法释疑

The C++ Standard Library p353

find_first_of属于非变动性算法,它的两种形式如下:

ForwardIterator1 find_first_of(
      ForwardIterator1 _First1,
      ForwardIterator1 _Last1,
      ForwardIterator2 _First2,
      ForwardIterator2 _Last2
   );
ForwardIterator1 find_first_of(
      ForwardIterator1 _First1,
      ForwardIterator1 _Last1,
      ForwardIterator2 _First2,
      ForwardIterator2 _Last2,
      BinaryPredicate _Comp
   );

先看第一种,书中代码简略如下

Code

     问题出在第18,这里有点疑问,就是逆向查找以找到searchcoll在coll中的最后一个元素位置,我开始以为既然查找的区间都是使用的逆向迭代器,那么searchcoll也应该使用searchcoll.rbegin(),searchcoll.rend(),更为奇怪的是更改后结果竟然完全相同。后来仔细看了下书才发现(看书不认真,bs下自己~),根据书中所说,find_first_of是返回第一个在源、目标区间出现的元素位置。原来目标区间是一个集合,而这个查找也是集合之间的比较,所以逆正都是无所谓。验证如下:

Code
     我们可以发现,比较的元素即使顺序不一致,只要在目标区间的元素存在于源区间,即会返回相等的第一个数的位置,与目标区间顺序无关。这里注意求distance中,因为是基于0开始的,所以要加一,但在rpos.base()即将逆向迭代器转化为正向迭代器的过程中已做了更改,所以不用加一。
posted @ 2009-02-06 00:54  纸纹  阅读(2546)  评论(0编辑  收藏  举报