• C++ equal()算法解析


      equal()算法比较简单,它的作用是比较两个容器是否相等然后返回布尔值,它有两种重载的实现方式,先看下算法的定义:

     1     // TEMPLATE FUNCTION equal WITH PRED
     2 template<class _InIt1,
     3     class _InIt2,
     4     class _Pr> inline
     5     bool _Equal(_InIt1 _First1, _InIt1 _Last1,
     6         _InIt2 _First2, _Pr _Pred)
     7     {    // compare [_First1, _Last1) to [_First2, ...) using _Pred
     8     for (; _First1 != _Last1; ++_First1, (void)++_First2)
     9         if (!_Pred(*_First1, *_First2))
    10             return (false);
    11     return (true);
    12     }

      这是提供第一个容器的头尾迭代器与第二个容器的头迭代器,遍历第一个容器的元素,通过仿函数判断后,有任一元素不符合条件则返回false,即两个容器可以不同大小。

      默认的仿函数为equal_to<>,其定义为

     1 template<class _Ty = void>
     2     struct equal_to
     3     {    // functor for operator==
     4     typedef _Ty first_argument_type;
     5     typedef _Ty second_argument_type;
     6     typedef bool result_type;
     7     _CONST_FUN bool operator()(const _Ty& _Left, const _Ty& _Right) const
     8         {    // apply operator== to operands
     9         return (_Left == _Right);
    10         }
    11     };

      即判断两值是否相等,结合equal()算法可知其实现为判断两个容器相同索引的元素是否相等,以第一个容器为比较范围。

      而equal()的提供两个容器头尾迭代器的重载实现则为:

     1 // TEMPLATE FUNCTION equal WITH TWO RANGES, PRED
     2 template<class _InIt1,
     3     class _InIt2,
     4     class _Pr> inline
     5     bool _Equal(_InIt1 _First1, _InIt1 _Last1,
     6         _InIt2 _First2, _InIt2 _Last2, _Pr _Pred,
     7             input_iterator_tag, input_iterator_tag)
     8     {    // compare [_First1, _Last1) to [_First2, _Last2)
     9         // using _Pred, arbitrary iterators
    10     _DEBUG_POINTER_IF(_First1 != _Last1 && _First2 != _Last2, _Pred);
    11     for (; _First1 != _Last1 && _First2 != _Last2; ++_First1, (void)++_First2)
    12         if (!_Pred(*_First1, *_First2))
    13             return (false);
    14     return (_First1 == _Last1 && _First2 == _Last2);
    15     }

      根据注释可以得知这种重载适用于任意类型的迭代器,从实现方式上看,其要求两个容器大小相同且元素相同

     1 template<class _InIt1,
     2     class _InIt2,
     3     class _Pr> inline
     4     bool _Equal(_InIt1 _First1, _InIt1 _Last1,
     5         _InIt2 _First2, _InIt2 _Last2, _Pr _Pred,
     6             random_access_iterator_tag, random_access_iterator_tag)
     7     {    // compare [_First1, _Last1) to [_First2, _Last2)
     8         // using _Pred, random-access iterators
     9     if (_Last1 - _First1 != _Last2 - _First2)
    10         return (false);
    11     _DEBUG_POINTER_IF(_First1 != _Last1, _Pred);
    12     return (_Equal(_First1, _Last1, _First2, _Pred));
    13     }

      根据注释可以得知这种重载适用于随机读取类型的迭代器,从实现方式上看,其要求两个容器大小相同,然后再调用第一种形式判断。
      这两种形式的重载都要求容器严格匹配,相对来说没有那么灵活

      下面做个演示:

    1 vector<int> a{ 1,2,3 }, b{ 1,2,3,4 };    
    2 cout << "以a为比较范围,判断a,b是否相同:" << equal(a.begin(),a.end(),b.begin()) << endl;
    3 cout << "要求容器相同,判断a,b是否相同:" << equal(a.begin(), a.end(), b.begin(), b.end()) << endl;

      结果:

    本文来自博客园,作者:Mr-xxx,转载请注明原文链接:https://www.cnblogs.com/MrLiuZF/p/14049343.html

  • 相关阅读:
    InnoDB实现MVCC原理
    Python中定义函数时参数有默认值的小陷阱
    Python系统编程笔记
    Python中的字典
    Python中常见的字符串小笔试题
    Oracle常见名词解析
    Oracle数据库面试题【转载】
    Oracle日期语言修改
    Oracle日期时间函数大全
    Oracle数据库分页的三种方法
  • 原文地址:https://www.cnblogs.com/MrLiuZF/p/14049343.html
Copyright © 2020-2023  润新知