一:功能解析

函数原型:

equality (1)    
template <class InputIterator1, class InputIterator2>
  bool equal (InputIterator1 first1, InputIterator1 last1,
              InputIterator2 first2);
predicate (2)   
template <class InputIterator1, class InputIterator2, class BinaryPredicate>
  bool equal (InputIterator1 first1, InputIterator1 last1,
              InputIterator2 first2, BinaryPredicate pred);

功能:

区间[ first1 , last1 )与以first2开始的区间逐一比较,如果与[ first1 , last1 )全部相等(或者满足pred),返回布尔值真,否则返回假。

例子:

// equal algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::equal
#include <vector>       // std::vectorbool mypredicate (int i, int j) {return (i==j);
}int main () {int myints[] = {20,40,60,80,100};               //   myints: 20 40 60 80 100std::vector<int>myvector (myints,myints+5);     // myvector: 20 40 60 80 100// using default comparison:if ( std::equal (myvector.begin(), myvector.end(), myints) )std::cout << "The contents of both sequences are equal.\n";elsestd::cout << "The contents of both sequences differ.\n";myvector[3]=81;                                 // myvector: 20 40 60 81 100// using predicate comparison:if ( std::equal (myvector.begin(), myvector.end(), myints, mypredicate) )std::cout << "The contents of both sequences are equal.\n";elsestd::cout << "The contents of both sequences differ.\n";return 0;
}

运行如下:

The contents of both sequences are equal.
The contents of both sequence differ.

二:源码剖析
// TEMPLATE FUNCTION equal WITH PRED
template<class _InIt1,class _InIt2,class _Pr> inlinebool _Equal(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _Pr _Pred){   // compare [_First1, _Last1) to [_First2, ...) using _Predfor (; _First1 != _Last1; ++_First1, (void)++_First2)if (!_Pred(*_First1, *_First2))return (false);return (true);}inline bool _Equal(const char *_First1, const char *_Last1,const char *_First2, equal_to<>){   // compare [_First1, _Last1) to [_First2, ...), for charsreturn (_CSTD memcmp(_First1, _First2, _Last1 - _First1) == 0);}inline bool _Equal(const signed char *_First1, const signed char *_Last1,const signed char *_First2, equal_to<>){   // compare [_First1, _Last1) to [_First2, ...), for signed charsreturn (_CSTD memcmp(_First1, _First2, _Last1 - _First1) == 0);}inline bool _Equal(const unsigned char *_First1, const unsigned char *_Last1,const unsigned char *_First2, equal_to<>){   // compare [_First1, _Last1) to [_First2, ...), for unsigned charsreturn (_CSTD memcmp(_First1, _First2, _Last1 - _First1) == 0);}inline bool _Equal(const char *_First1, const char *_Last1,const char *_First2, _Char_traits_eq<char_traits<char>>){   // compare [_First1, _Last1) to [_First2, ...), for charsreturn (_CSTD memcmp(_First1, _First2, _Last1 - _First1) == 0);}#if _ITERATOR_DEBUG_LEVEL == 0
template<class _InIt1,class _InIt2,class _Pr> inlinebool equal(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _Pr _Pred){   // compare [_First1, _Last1) to [_First2, ...) using _Predreturn (_Equal(_Unchecked(_First1), _Unchecked(_Last1),_Unchecked(_First2), _Pred));}#else /* _ITERATOR_DEBUG_LEVEL == 0 */
template<class _InIt1,class _InIt2,class _Pr> inlinebool _Equal2(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _Pr _Pred, true_type){   // compare [_First1, _Last1) to [_First2, ...) using _Pred, checkedreturn (_Equal(_First1, _Last1,_First2, _Pred));}template<class _InIt1,class _InIt2,class _Pr> inline
_SCL_INSECURE_DEPRECATEbool _Equal2(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _Pr _Pred, false_type){   // compare [_First1, _Last1) to [_First2, ...) using _Pred, uncheckedreturn (_Equal(_First1, _Last1,_First2, _Pred));}template<class _InIt1,class _InIt2,class _Pr> inlinebool equal(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _Pr _Pred){   // compare [_First1, _Last1) to [_First2, ...) using _Pred_DEBUG_RANGE_PTR(_First1, _Last1, _First2);_DEBUG_POINTER_IF(_First1 != _Last1, _Pred);return (_Equal2(_Unchecked(_First1), _Unchecked(_Last1),_First2, _Pred, _Is_checked(_First2)));}#if _ITERATOR_DEBUG_ARRAY_OVERLOADS
template<class _InIt1,class _InTy,size_t _InSize,class _Pr> inlinebool equal(_InIt1 _First1, _InIt1 _Last1,_InTy (&_First2)[_InSize], _Pr _Pred){   // compare [_First1, _Last1) to [_First2, ...) using _Predreturn (_STD equal(_First1, _Last1,_Array_iterator<_InTy, _InSize>(_First2), _Pred));}#endif /* _ITERATOR_DEBUG_ARRAY_OVERLOADS */#endif /* _ITERATOR_DEBUG_LEVEL == 0 */// TEMPLATE FUNCTION equal
template<class _InIt1,class _InIt2> inlinebool equal(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2){   // compare [_First1, _Last1) to [_First2, ...)return (_STD equal(_First1, _Last1, _First2,equal_to<>()));}#if _ITERATOR_DEBUG_ARRAY_OVERLOADS
template<class _InIt1,class _InTy,size_t _InSize> inlinebool equal(_InIt1 _First1, _InIt1 _Last1,_InTy (&_First2)[_InSize]){   // compare [_First1, _Last1) to [_First2, ...)return (_STD equal(_First1, _Last1, _First2,equal_to<>()));}#endif /* _ITERATOR_DEBUG_ARRAY_OVERLOADS */// TEMPLATE FUNCTION equal WITH TWO RANGES, PRED
template<class _InIt1,class _InIt2,class _Pr> inlinebool _Equal(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _InIt2 _Last2, _Pr _Pred,input_iterator_tag, input_iterator_tag){   // compare [_First1, _Last1) to [_First2, _Last2)// using _Pred, arbitrary iterators_DEBUG_POINTER_IF(_First1 != _Last1 && _First2 != _Last2, _Pred);for (; _First1 != _Last1 && _First2 != _Last2; ++_First1, (void)++_First2)if (!_Pred(*_First1, *_First2))return (false);return (_First1 == _Last1 && _First2 == _Last2);}template<class _InIt1,class _InIt2,class _Pr> inlinebool _Equal(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _InIt2 _Last2, _Pr _Pred,random_access_iterator_tag, random_access_iterator_tag){   // compare [_First1, _Last1) to [_First2, _Last2)// using _Pred, random-access iteratorsif (_Last1 - _First1 != _Last2 - _First2)return (false);_DEBUG_POINTER_IF(_First1 != _Last1, _Pred);return (_Equal(_First1, _Last1, _First2, _Pred));}template<class _InIt1,class _InIt2,class _Pr> inlinebool equal(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _InIt2 _Last2, _Pr _Pred){   // compare [_First1, _Last1) to [_First2, _Last2) using _Pred_DEBUG_RANGE(_First1, _Last1);_DEBUG_RANGE(_First2, _Last2);return (_Equal(_Unchecked(_First1), _Unchecked(_Last1),_Unchecked(_First2), _Unchecked(_Last2), _Pred,_Iter_cat(_First1), _Iter_cat(_First2)));}// TEMPLATE FUNCTION equal WITH TWO RANGES
template<class _InIt1,class _InIt2> inlinebool equal(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _InIt2 _Last2){   // compare [_First1, _Last1) to [_First2, _Last2)return (_STD equal(_First1, _Last1, _First2, _Last2,equal_to<>()));}

源码摘抄自Visual Studio 2015安装目录algorithm文件中。

点击进入目录----> C++源码剖析目录

equal 源码剖析相关推荐

  1. STL源码剖析 算法开篇

    STL源码剖析 算法章节 算法总览_CHYabc123456hh的博客-CSDN博客 质变算法 质变算法 - 会改变操作对象的数值,比如互换.替换.填写.删除.排列组合.分隔.随机重排.排序等 #in ...

  2. SpringDataJPA+Hibernate框架源码剖析(六)@PersistenceContext和@Autowired注入EntityManager的区别

    SpringDataJPA+Hibernate框架源码剖析系列文章: SpringDataJPA+Hibernate框架源码剖析(一)框架介绍 SpringDataJPA+Hibernate框架源码剖 ...

  3. K8s基础知识学习笔记及部分源码剖析

    K8s基础知识学习笔记及部分源码剖析 在学习b站黑马k8s视频资料的基础上,查阅了配套基础知识笔记和源码剖析,仅作个人学习和回顾使用. 参考资料: 概念 | Kubernetes 四层.七层负载均衡的 ...

  4. 【Redis源码剖析】 - Redis内置数据结构之压缩列表ziplist

    在前面的一篇文章[Redis源码剖析] - Redis内置数据结构之双向链表中,我们介绍了Redis封装的一种"传统"双向链表list,分别使用prev.next指针来指向当前节点 ...

  5. 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...

    老李推荐:第14章4节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中, ...

  6. JS魔法堂:mmDeferred源码剖析

    一.前言 avalon.js的影响力愈发强劲,而作为子模块之一的mmDeferred必然成为异步调用模式学习之旅的又一站呢!本文将记录我对mmDeferred的认识,若有纰漏请各位指正,谢谢.项目请见 ...

  7. Kafka源码剖析 —— 网络I/O篇 —— 浅析KafkaSelector

    为什么80%的码农都做不了架构师?>>>    ##NioSelector和KafkaSelector有什么区别? 先说结论,KafkaSelector(org.apache.kaf ...

  8. Mongoose源码剖析:Introduction and Installation

    引言 要剖析Mongoose的源码,首先你得知道它的一些基本情况和特性.并去使用它.本文就是介绍Mongoose是个什么东西?及如何安装和使用?这里假设你知道什么web服务器软件.web服务器使用什么 ...

  9. 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...

    老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionPro ...

  10. 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1...

    老李推荐:第3章3节<MonkeyRunner源码剖析>脚本编写示例: MonkeyImage API使用示例 在上一节的第一个"增加日记"的示例中,我们并没有看到日记 ...

最新文章

  1. IIS调用批处理权限的处理
  2. Kotlin的解析(中)
  3. Qt Creator操作方法
  4. 麻省理工学院《算法导论》(MIT - Introduction to Algorithms)
  5. 设计模式--观察者模式与命令模式
  6. 利用机器学习实现微信小程序-加减大师自动答题
  7. 【Java与智能设备】ch0501 Intent的使用
  8. CNDS-markdowm使用方法(^ _ ^)
  9. 计算标准累积正态分布_神说要有正态分布,于是就有了正态分布。
  10. mysql 建复合索引_mysql 建立复合索引
  11. 职等你来 | UE/UX交互设计师(15k);时钟AE工程师;数字IC验证工程师(薪资开放)
  12. matlab 分水岭法,分水岭算法Matlab实现——三种方法 | 学步园
  13. Linux CRDA(Central Regulatory Domain Agent)简介
  14. MongoDB的$and的用法
  15. 学历学籍系统-Web服务开发实验(REST API)
  16. Greenplum的系统表
  17. VS:如何离线使用Nuget安装包
  18. 深切悼念JAVA培训界第一人张孝祥老师意外辞世
  19. 关注与粉丝表结构设计及查询
  20. css3魔方3乘3每层旋转_CSS3旋转魔方

热门文章

  1. SpringBoot基础
  2. 何同学采访苹果CEO库克上热搜,网友表示自愧不如
  3. 基于asp.net714零食销售海米跨境电子商务商城
  4. win10找不到计算机配置文件,Win10个性化设置无法打开提示该文件没有与之关联的程序怎么办?...
  5. 迪赛智慧数——柱状图(堆叠极扇图):近5年各行业员工离职率
  6. 友情链接加nofollow_如何在WordPress中Nofollow所有外部链接
  7. 【初级篇】网页引入live2d
  8. 灵活易用的液体创可贴,让伤口愈合更快,海氏海诺液体创可贴上手
  9. qq空间不能访问解决方法
  10. android textview 字母数字键盘,android数字键盘怎样设置成默认的