本文内容来自C++Plus,本文只是本人的总结和翻译而已。本人只是C++的搬运工。
原文传送门:http://www.cplusplus.com/reference/algorithm/find_end/
find_end():用来进行两个范围空间内有序数据的查找。
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2)
{
if (first2==last2) return last1; // specified in C++11
ForwardIterator1 ret = last1;
while (first1!=last1)
{
ForwardIterator1 it1 = first1;
ForwardIterator2 it2 = first2;
while (*it1==*it2) { // or: while (pred(*it1,*it2)) for version (2)
++it1; ++it2;
if (it2==last2) { ret=first1; break; }
if (it1==last1) return ret;
}
++first1;
}
return ret;
}
算法一开始会对[First2,last2)的大小为0,就返回last1,然后再次检查[First1,last1)这段空间是否为0,如果不为0就开始循环。在这里定义了两个临时变量it1,it2,如果it1和it2相等的话就不停的向后空间的末尾移动,当移动到[First2,last2)的末尾的时候,就返回该值在[First1,last1)中对应的值,Break掉,并且进行下次大循环查找。整个逻辑就是这样,接下来说下注意事项。
注意:
1.如果收索的[First2,last2)>[First1,last1),在找到值后向下迭代的时候,It1==last而It2还没有见底的话,就返回lats1。这里等会分析VS中find_end()算法,会比这个算法的写法在这方面做的优秀。
2.find_end()算法只可以按照[First1,last1)这段空间中的排序进行搜索,比如[First1,last1)中为{1,2,3,4,5},难么[First2,last2)中要是收索{1,3,5}就不行。
3.Find_end()算法会返回收索到的最后一个符合条件的值,比如[First1,last1)中{ 1, 2, 3, 4,5, 1,2, 3},在[First2,last2)中收索{1,2,3}会返回红色的{1,2,3}这个有序数据。
最后我们来分析VS 中Find_end()算法的是如何判断[First2,last2)>[First1,last1)这段空间的。。。
for (; _Count2 <= _Count1; ++_First1, --_Count1)
{ // room for match, try it
_FwdIt1 _Mid1 = _First1;
for (_FwdIt2 _Mid2 = _First2;; ++_Mid1)
if (!_Pred(*_Mid1, *_Mid2))
break;
else if (++_Mid2 == _Last2)
{ // potential answer, save it
_Ans = _First1;
break;
}
}
在Find_end()开始循环的位置,如果
First2,last2)>
[First1,last1),直接跳出了循环,所以VS中的代码虽然写的比较复杂不如C++Plus中的简洁,但是在判断First2,last2)>[First1,last1)这方面效率还是相对较高的。