STL_ search()



  • hallo zusammen,
    in STL gibt es die search() Algorithmen, bei der Version_2 verstehe ich nicht die folgende Codes:

    **while (__first1 != __last1) {
    if (__predicate(*__first1, *__first2)) break;
    ++__first1;
    }
    while (__first1 != __last1 && !__predicate(*__first1, *__first2))
    ++__first1;
    **
    ich glaube, die zwei while() Schleife funktionieren genau selbe! einmal überflüssig?

    version_1:

    template <class _ForwardIter1, class _ForwardIter2>
    _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,_ForwardIter2 __first2, _ForwardIter2 __last2)
    {
      // Test for empty ranges
      if (__first1 == __last1 || __first2 == __last2)
        return __first1;
    
      // Test for a pattern of length 1.
      _ForwardIter2 __tmp(__first2);
      ++__tmp;
      if (__tmp == __last2)
        return find(__first1, __last1, *__first2);
    
      // General case.
      _ForwardIter2 __p1, __p;
      __p1 = __first2; ++__p1;
      _ForwardIter1 __current = __first1;
    
      while (__first1 != __last1) {
        __first1 = find(__first1, __last1, *__first2);
        if (__first1 == __last1) return __last1;
    
        __p = __p1;
        __current = __first1;
        if (++__current == __last1)
          return __last1;
        while (*__current == *__p) {
          if (++__p == __last2)
            return __first1;
          if (++__current == __last1)
            return __last1;
        }
        ++__first1;
      }
      return __first1;
    }
    

    version_2:

    template <class _ForwardIter1, class _ForwardIter2, class _BinaryPred>
    _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,_ForwardIter2 __first2, _ForwardIter2 __last2,
                         _BinaryPred  __predicate)
    {
      // Test for empty ranges
      if (__first1 == __last1 || __first2 == __last2)
        return __first1;
    
      // Test for a pattern of length 1.
      _ForwardIter2 __tmp(__first2);
      ++__tmp;
      if (__tmp == __last2) {
        while (__first1 != __last1 && !__predicate(*__first1, *__first2))
          ++__first1;
        return __first1;    
      }
    
      // General case.
      _ForwardIter2 __p1, __p;
      __p1 = __first2; ++__p1;
      _ForwardIter1 __current = __first1;
    
      while (__first1 != __last1) {
    
    //---------------------------------------------------
        while (__first1 != __last1) {
          if (__predicate(*__first1, *__first2)) break;
          ++__first1;
        }
        while (__first1 != __last1 && !__predicate(*__first1, *__first2))
          ++__first1;
    //-------------------------------------------------------------
    
        if (__first1 == __last1) return __last1;
    
        __p = __p1;
        __current = __first1;
        if (++__current == __last1) return __last1;
    
        while (__predicate(*__current, *__p)) {
          if (++__p == __last2)
            return __first1;
          if (++__current == __last1)
            return __last1;
        }
        ++__first1;
      }
      return __first1;
    }
    


  • Ich kann jedenfalls keinen Unterschied bei den while-Schleifen entdecken!


Anmelden zum Antworten