STL Find_end算法

本文内容来自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)这方面效率还是相对较高的。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值