equal 源码剖析
一:功能解析
函数原型:
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 源码剖析相关推荐
- STL源码剖析 算法开篇
STL源码剖析 算法章节 算法总览_CHYabc123456hh的博客-CSDN博客 质变算法 质变算法 - 会改变操作对象的数值,比如互换.替换.填写.删除.排列组合.分隔.随机重排.排序等 #in ...
- SpringDataJPA+Hibernate框架源码剖析(六)@PersistenceContext和@Autowired注入EntityManager的区别
SpringDataJPA+Hibernate框架源码剖析系列文章: SpringDataJPA+Hibernate框架源码剖析(一)框架介绍 SpringDataJPA+Hibernate框架源码剖 ...
- K8s基础知识学习笔记及部分源码剖析
K8s基础知识学习笔记及部分源码剖析 在学习b站黑马k8s视频资料的基础上,查阅了配套基础知识笔记和源码剖析,仅作个人学习和回顾使用. 参考资料: 概念 | Kubernetes 四层.七层负载均衡的 ...
- 【Redis源码剖析】 - Redis内置数据结构之压缩列表ziplist
在前面的一篇文章[Redis源码剖析] - Redis内置数据结构之双向链表中,我们介绍了Redis封装的一种"传统"双向链表list,分别使用prev.next指针来指向当前节点 ...
- 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...
老李推荐:第14章4节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中, ...
- JS魔法堂:mmDeferred源码剖析
一.前言 avalon.js的影响力愈发强劲,而作为子模块之一的mmDeferred必然成为异步调用模式学习之旅的又一站呢!本文将记录我对mmDeferred的认识,若有纰漏请各位指正,谢谢.项目请见 ...
- Kafka源码剖析 —— 网络I/O篇 —— 浅析KafkaSelector
为什么80%的码农都做不了架构师?>>> ##NioSelector和KafkaSelector有什么区别? 先说结论,KafkaSelector(org.apache.kaf ...
- Mongoose源码剖析:Introduction and Installation
引言 要剖析Mongoose的源码,首先你得知道它的一些基本情况和特性.并去使用它.本文就是介绍Mongoose是个什么东西?及如何安装和使用?这里假设你知道什么web服务器软件.web服务器使用什么 ...
- 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...
老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionPro ...
- 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1...
老李推荐:第3章3节<MonkeyRunner源码剖析>脚本编写示例: MonkeyImage API使用示例 在上一节的第一个"增加日记"的示例中,我们并没有看到日记 ...
最新文章
- IIS调用批处理权限的处理
- Kotlin的解析(中)
- Qt Creator操作方法
- 麻省理工学院《算法导论》(MIT - Introduction to Algorithms)
- 设计模式--观察者模式与命令模式
- 利用机器学习实现微信小程序-加减大师自动答题
- 【Java与智能设备】ch0501 Intent的使用
- CNDS-markdowm使用方法(^ _ ^)
- 计算标准累积正态分布_神说要有正态分布,于是就有了正态分布。
- mysql 建复合索引_mysql 建立复合索引
- 职等你来 | UE/UX交互设计师(15k);时钟AE工程师;数字IC验证工程师(薪资开放)
- matlab 分水岭法,分水岭算法Matlab实现——三种方法 | 学步园
- Linux CRDA(Central Regulatory Domain Agent)简介
- MongoDB的$and的用法
- 学历学籍系统-Web服务开发实验(REST API)
- Greenplum的系统表
- VS:如何离线使用Nuget安装包
- 深切悼念JAVA培训界第一人张孝祥老师意外辞世
- 关注与粉丝表结构设计及查询
- css3魔方3乘3每层旋转_CSS3旋转魔方
热门文章
- SpringBoot基础
- 何同学采访苹果CEO库克上热搜,网友表示自愧不如
- 基于asp.net714零食销售海米跨境电子商务商城
- win10找不到计算机配置文件,Win10个性化设置无法打开提示该文件没有与之关联的程序怎么办?...
- 迪赛智慧数——柱状图(堆叠极扇图):近5年各行业员工离职率
- 友情链接加nofollow_如何在WordPress中Nofollow所有外部链接
- 【初级篇】网页引入live2d
- 灵活易用的液体创可贴,让伤口愈合更快,海氏海诺液体创可贴上手
- qq空间不能访问解决方法
- android textview 字母数字键盘,android数字键盘怎样设置成默认的