///因为篇幅太长,因此,删去了非常多接口,仅仅分析了内部实现,算法对迭代器的要求也被删去
/// search.
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) ///假设欲寻找区间范围为1,则调用find函数处理
return find(__first1, __last1, *__first2);
/// General case.
_ForwardIter2 __p1, __p;
__p1 = __first2; ++__p1;
_ForwardIter1 __current = __first1;
while (__first1 != __last1) {
///先使用find找到欲寻找区间的第一个元素在主区间中出现的位置
///将其赋给__first1,其前面的区间已不须要再考虑
__first1 = find(__first1, __last1, *__first2);
if (__first1 == __last1) ///第一个元素不存在,说明欲寻找区间一定不存在
return __last1;
__p = __p1; ///__p为欲寻找区间的第二个元素
__current = __first1;
///欲寻找区间的第一个元已经排除素为主区间的最后一个元素,因为前面
///已经排除欲寻找区间长度为1的情况,因此可判定寻找失败
if (++__current == __last1)
return __last1;
///挨个比較两个区间
while (*__current == *__p) {
///欲寻找区间结束,查找成功,返回__first1,即欲寻找区间
///的第一个元素在主区间的位置
if (++__p == __last2)
return __first1;
///主区间先于欲寻找区间结束,查找失败
if (++__current == __last1)
return __last1;
}
///某个元素不匹配,返回到主区间匹配到与查找区间第一个元素的位置
///继续匹配
++__first1;
}
return __first1;
}
/// search_n. Search for __count consecutive copies of __val.
template <class _ForwardIter, class _Integer, class _Tp>
_ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
_Integer __count, const _Tp& __val) {
if (__count <= 0)
return __first;
else {
///先使用find找到第一个__val
__first = find(__first, __last, __val);
///主区间尚未被遍历完
while (__first != __last) {
_Integer __n = __count - 1;
_ForwardIter __i = __first;
++__i;
while (__i != __last && __n != 0 && *__i == __val) {
++__i;
--__n;
}
if (__n == 0) ///匹配成功
return __first;
else ///直接从主区间已遍历的下一个位置開始匹配
///因为是n个相同元素的匹配,因此,前面不可能有漏配的区间
__first = find(__i, __last, __val);
}
///主区间已被遍历完,查找失败
return __last;
}
}
// unique and unique_copy
template <class _InputIter, class _OutputIter, class _Tp>
_OutputIter __unique_copy(_InputIter __first, _InputIter __last,
_OutputIter __result, _Tp*) {
_Tp __value = *__first;
*__result = __value;
while (++__first != __last)
{
///假设__value != *__first,运行循环体进行复制,否则忽略
///进行下一个元素的处理
if (!(__value == *__first)) {
__value = *__first;
*++__result = __value;
}
}
return ++__result;
}
/// rotate and rotate_copy, and their auxiliary functions
///以middle为界,对first,last进行翻转的一组函数,即将[first,middle,last)
///转置成为[middle,last-1,first,middle),採用了针对forward_iter,bidrectionaal_iter,
///random_iter三种迭代器的不同算法,力求高效
///辗转相除法求m和n的最大公约数
template <class _EuclideanRingElement>
_EuclideanRingElement __gcd(_EuclideanRingElement __m,
_EuclideanRingElement __n)
{
while (__n != 0) {
_EuclideanRingElement __t = __m % __n;
__m = __n;
__n = __t;
}
return __m;
}
///对forward_iterator採用的算法
///因为forward_iterator的限制,做了一些反复的复制工作
template <class _ForwardIter, class _Distance>
_ForwardIter __rotate(_ForwardIter __first,
_ForwardIter __middle,
_ForwardIter __last,
_Distance*,
forward_iterator_tag) {
///不须要翻转的情况
if (__first == __middle)
return __last;
if (__last == __middle)
return __first;
_ForwardIter __first2 = __middle;
///此循环保证把[middle,last)调整至最前端,事实上这个循环出现主要是为了
///得到new_middle,而且轻微的提高性能(和最后面的循环相比,他的推断条件
///少了一个),假设不考虑这两点,这个循环全然能够去掉。
do {
swap(*__first++, *__first2++);
if (__first == __middle)
__middle = __first2;
} while (__first2 != __last);
///此时,[middle,last)已经调整至最前端,如今仅仅需在[first,middle)内部调整
_ForwardIter __new_middle = __first;
__first2 = __middle;
while (__first2 != __last) {
swap (*__first++, *__first2++);
if (__first == __middle)
__middle = __first2;
else if (__first2 == __last)
__first2 = __middle;
}
return __new_middle;
}
///对于BidrectionalIter採用的算法,通过不同条件下调用reverse实现
template <class _BidirectionalIter, class _Distance>
_BidirectionalIter __rotate(_BidirectionalIter __first,
_BidirectionalIter __middle,
_BidirectionalIter __last,
_Distance*,
bidirectional_iterator_tag) {
if (__first == __middle)
return __last;
if (__last == __middle)
return __first;
__reverse(__first, __middle, bidirectional_iterator_tag());
__reverse(__middle, __last, bidirectional_iterator_tag());
while (__first != __middle && __middle != __last)
swap (*__first++, *--__last);
if (__first == __middle) {
///__middle之前元素较少,因此须要将__middle,__last区间
///(此区间未被交换)翻转到原来的顺序
__reverse(__middle, __last, bidirectional_iterator_tag());
return __last;
}
else {
__reverse(__first, __middle, bidirectional_iterator_tag());
return __first;
}
}
template <class _RandomAccessIter, class _Distance, class _Tp>
_RandomAccessIter __rotate(_RandomAccessIter __first,
_RandomAccessIter __middle,
_RandomAccessIter __last,
_Distance *, _Tp *) {
_Distance __n = __last - __first; ///总元素数
_Distance __k = __middle - __first; ///__middle之前的元素数(不包含__middle)
_Distance __l = __n - __k; ///__middle之后的元素数
_RandomAccessIter __result = __first + (__last - __middle); ///new middle
if (__k == 0)
return __last;
else if (__k == __l) { ///__middle前后元素数目相同
swap_ranges(__first, __middle, __middle);
return __result;
}
_Distance __d = __gcd(__n, __k); ///__d是__middle之前元素数和总元素数的最大公约数
for (_Distance __i = 0; __i < __d; __i++) { ///循环__d次就可以
_Tp __tmp = *__first;
_RandomAccessIter __p = __first;
if (__k < __l) { ///__middle前面的元素数目小于后面
for (_Distance __j = 0; __j < __l/__d; __j++) {
if (__p > __first + __l) { ///__p在new middle 之后
*__p = *(__p - __l); ///*(__p - __l)应该放在__p所在位置
__p -= __l; ///将__p退后__l
}
*__p = *(__p + __k); ///__p在new middle 之前时,这个赋值永远是精准地
__p += __k;
}
}
else {
for (_Distance __j = 0; __j < __k/__d - 1; __j ++) {
if (__p < __last - __k) {
*__p = *(__p + __k);
__p += __k;
}
*__p = * (__p - __l);
__p -= __l;
}
}
*__p = __tmp;
++__first; ///每次循环将__first增1
}
return __result;
}
/// partition, stable_partition, and their auxiliary functions
template <class _ForwardIter, class _Predicate>
_ForwardIter __partition(_ForwardIter __first,
_ForwardIter __last,
_Predicate __pred,
forward_iterator_tag) {
if (__first == __last) return __first;
while (__pred(*__first)) ///找到第一个不符合条件的元素
if (++__first == __last) return __first;
_ForwardIter __next = __first;
while (++__next != __last)
if (__pred(*__next)) { ///找到符合条件的next将其交换到前面
swap(*__first, *__next);
++__first;
}
return __first;
}
///克服了前面因为forward_iter的限制而产生的反复交换
template <class _BidirectionalIter, class _Predicate>
_BidirectionalIter __partition(_BidirectionalIter __first,
_BidirectionalIter __last,
_Predicate __pred,
bidirectional_iterator_tag) {
while (true) {
while (true)
if (__first == __last)
return __first;
else if (__pred(*__first))
++__first;
else
break;
--__last;
while (true)
if (__first == __last)
return __first;
else if (!__pred(*__last))
--__last;
else
break;
iter_swap(__first, __last);
++__first;
}
}
///调用此函数需保证*__first<=__pivot<=*(__last-1),因为有这个前提条件
///所以不须要推断是否越界
template <class _RandomAccessIter, class _Tp>
_RandomAccessIter __unguarded_partition(_RandomAccessIter __first,
_RandomAccessIter __last,
_Tp __pivot)
{
while (true) {
while (*__first < __pivot)
++__first;
--__last;
while (__pivot < *__last)
--__last;
if (!(__first < __last))
return __first;
iter_swap(__first, __last);
++__first;
}
}
///STL sort函数,为了高效,可谓是把主要的排序算法都用到了
///其主体採用高速排序和插入排序,当高速排序的效率变得不可接受时
///採用堆排序。当划分的子区间小于等于一定程度(即以下的_stl_threshold)时
///退出高速排序,留给最后的插入排序处理
///以下是他的一些辅助函数和他本身的实现
const int __stl_threshold = 16;
/// sort() and its auxiliary functions.
///插入函数:是插入排序的辅助函数
///调用此函数相同必须保证*__first<__val,当中__first没有显式出现
///因此,相同不须要推断越界
template <class _RandomAccessIter, class _Tp>
void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val) {
_RandomAccessIter __next = __last;
--__next;
while (__val < *__next) {
*__last = *__next;
__last = __next;
--__next;
}
*__last = __val;
}
template <class _RandomAccessIter, class _Tp>
inline void __linear_insert(_RandomAccessIter __first,
_RandomAccessIter __last, _Tp*) {
_Tp __val = *__last;
if (__val < *__first) {
copy_backward(__first, __last, __last + 1);
*__first = __val;
}
else
__unguarded_linear_insert(__last, __val);
}
///插入排序,是排序的规模小到一定程度时採用的排序方法
template <class _RandomAccessIter>
void __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last) {
if (__first == __last) return;
for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
__linear_insert(__first, __i, __VALUE_TYPE(__first));
}
///插入排序,此时必须保证*__first是最小值
template <class _RandomAccessIter, class _Tp>
void __unguarded_insertion_sort_aux(_RandomAccessIter __first,
_RandomAccessIter __last, _Tp*) {
for (_RandomAccessIter __i = __first; __i != __last; ++__i)
__unguarded_linear_insert(__i, _Tp(*__i));
}
template <class _RandomAccessIter>
inline void __unguarded_insertion_sort(_RandomAccessIter __first,
_RandomAccessIter __last) {
__unguarded_insertion_sort_aux(__first, __last, __VALUE_TYPE(__first));
}
///对部分排序的区间进行最后的总体排序
template <class _RandomAccessIter>
void __final_insertion_sort(_RandomAccessIter __first,
_RandomAccessIter __last) {
if (__last - __first > __stl_threshold) {
///长度大于16时,对前面的16个元素进行_insertion_sort后
///对兴许元素则可直接调用__unguarded_insertion_sort以提高效率
__insertion_sort(__first, __first + __stl_threshold);
__unguarded_insertion_sort(__first + __stl_threshold, __last);
}
else ///长度小于16时不必调用两次函数
__insertion_sort(__first, __last);
}
///lg 2 为底 n的对数,用于计算一定长度的序列排序须要的高速排序
///最大递归深度,以推断其效率是否已下降到不可接受的程度
template <class _Size>
inline _Size __lg(_Size __n) {
_Size __k;
for (__k = 0; __n != 1; __n >>= 1) ++__k;
return __k;
}
///部分排序,保证__first,__middle之间的元素最小而且有序
template <class _RandomAccessIter, class _Tp>
void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
_RandomAccessIter __last, _Tp*) {
make_heap(__first, __middle);
for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
if (*__i < *__first)
__pop_heap(__first, __middle, __i, _Tp(*__i),
__DISTANCE_TYPE(__first));
sort_heap(__first, __middle);
}
template <class _RandomAccessIter, class _Tp, class _Size>
void __introsort_loop(_RandomAccessIter __first,
_RandomAccessIter __last, _Tp*,
_Size __depth_limit)
{
///长度不大于16退出,由最后的插入排序处理
///以减小递归深度
while (__last - __first > __stl_threshold) {
if (__depth_limit == 0) {
///说明高速排序效率已经不可接受,转而採用堆排序
///这里尽管调用partial_sort,但实际上使用了其全然的堆排序(__middle = __last)
partial_sort(__first, __last, __last);
return;
}
///每进行一次递归调用,__depth_limit降低1次
--__depth_limit;
///高速排序的标志元用首、尾元素和中间元素的中间值得到,得到的值
///一定大于等于first而小于等于__last-1,因而採用__unguarded_partition
///并依据中间值来划分子序列
_RandomAccessIter __cut =
__unguarded_partition(__first, __last,
_Tp(__median(*__first,
*(__first + (__last - __first)/2),
*(__last - 1))));
///对后一半子序列进行递归调用高速排序
__introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit);
__last = __cut; ///在while循环中处理前一半子序列,从而降低了递归调用的次数
}
}
template <class _RandomAccessIter>
inline void sort(_RandomAccessIter __first, _RandomAccessIter __last) {
__STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
__STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
_LessThanComparable);
if (__first != __last) {
__introsort_loop(__first, __last,
__VALUE_TYPE(__first),
__lg(__last - __first) * 2);
///最后的插入排序处理
__final_insertion_sort(__first, __last);
}
}
template <class _InputIter, class _RandomAccessIter, class _Distance,
class _Tp>
_RandomAccessIter __partial_sort_copy(_InputIter __first,
_InputIter __last,
_RandomAccessIter __result_first,
_RandomAccessIter __result_last,
_Distance*, _Tp*) {
if (__result_first == __result_last) return __result_last;
_RandomAccessIter __result_real_last = __result_first;
while(__first != __last && __result_real_last != __result_last) {
*__result_real_last = *__first;
++__result_real_last;
++__first;
}
make_heap(__result_first, __result_real_last);
while (__first != __last) { ///将源区间内剩余的较小元素调整至目标区间
if (*__first < *__result_first)
__adjust_heap(__result_first, _Distance(0),
_Distance(__result_real_last - __result_first),
_Tp(*__first));
++__first;
}
sort_heap(__result_first, __result_real_last);
return __result_real_last;
}
/// nth_element() and its auxiliary functions.
///保证排序以后nth之前的元素均比nth小,nth之后的元素均比nth大
template <class _RandomAccessIter, class _Tp>
void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
_RandomAccessIter __last, _Tp*) {
while (__last - __first > 3) {
///长度大于3时进行切割,
_RandomAccessIter __cut =
__unguarded_partition(__first, __last,
_Tp(__median(*__first,
*(__first + (__last - __first)/2),
*(__last - 1))));
///缩小切割区间
if (__cut <= __nth)
__first = __cut;
else
__last = __cut;
}
///区间长度不大于3时直接插入排序就可以
__insertion_sort(__first, __last);
}
/// Binary search (lower_bound, upper_bound, equal_range, binary_search).
///看lower_bound和upper_bound实现的差别
template <class _ForwardIter, class _Tp, class _Distance>
_ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
const _Tp& __val, _Distance*)
{
_Distance __len = 0;
distance(__first, __last, __len);
_Distance __half;
_ForwardIter __middle;
while (__len > 0) {
__half = __len >> 1; ///右移1位,相当于除2
__middle = __first;
advance(__middle, __half); ///找到middle,并比較
///仅仅有当val > *__middle时才向后查找
if (*__middle < __val) {
__first = __middle;
++__first;
__len = __len - __half - 1;
}
else ///val <= *__middle时均向前查找
__len = __half;
}
return __first;
}
template <class _ForwardIter, class _Tp, class _Distance>
_ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
const _Tp& __val, _Distance*)
{
_Distance __len = 0;
distance(__first, __last, __len);
_Distance __half;
_ForwardIter __middle;
while (__len > 0) {
__half = __len >> 1;
__middle = __first;
advance(__middle, __half);
///仅仅有当val < *__middle时才向前查找
if (__val < *__middle)
__len = __half;
else { ///val >= *__middle时均向后查找
__first = __middle;
++__first;
__len = __len - __half - 1;
}
}
return __first;
}
template <class _ForwardIter, class _Tp, class _Distance>
pair<_ForwardIter, _ForwardIter>
__equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
_Distance*)
{
_Distance __len = 0;
distance(__first, __last, __len);
_Distance __half;
_ForwardIter __middle, __left, __right;
while (__len > 0) {
__half = __len >> 1;
__middle = __first;
advance(__middle, __half);
///先採用类似lower_bound的方法找到一个等于val的值
if (*__middle < __val) {
__first = __middle;
++__first;
__len = __len - __half - 1;
}
else if (__val < *__middle)
__len = __half;
else { ///找到后分区间调用lower和upper_bound找到__left和__right的位置
///这样做要比一開始就调用lower_bound和upper_bound高效一些
__left = lower_bound(__first, __middle, __val);
advance(__first, __len);
__right = upper_bound(++__middle, __first, __val);
return pair<_ForwardIter, _ForwardIter>(__left, __right);
}
}
///说明未找到
return pair<_ForwardIter, _ForwardIter>(__first, __first);
}
///二分查找,依赖lower_bound实现
template <class _ForwardIter, class _Tp>
bool binary_search(_ForwardIter __first, _ForwardIter __last,
const _Tp& __val) {
_ForwardIter __i = lower_bound(__first, __last, __val);
return __i != __last && !(__val < *__i);
}
/// merge, with and without an explicitly supplied comparison function.
template <class _InputIter1, class _InputIter2, class _OutputIter>
_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
_OutputIter __result) {
while (__first1 != __last1 && __first2 != __last2) {
if (*__first2 < *__first1) {
*__result = *__first2;
++__first2;
}
else {
*__result = *__first1;
++__first1;
}
++__result;
}
return copy(__first2, __last2, copy(__first1, __last1, __result));
}
/// Set algorithms: includes, set_union, set_intersection, set_difference,
/// set_symmetric_difference. All of these algorithms have the precondition
/// that their input ranges are sorted and the postcondition that their output
/// ranges are sorted.
///集合类操作须要保证集合元素是已排序的,算是依据已排序
///序列的特性实现的
template <class _InputIter1, class _InputIter2>
bool includes(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2) {
while (__first1 != __last1 && __first2 != __last2)
if (*__first2 < *__first1)
return false;
else if(*__first1 < *__first2)
++__first1;
else
++__first1, ++__first2;
return __first2 == __last2;
}
///和merge非常类似,但不会反复包含两个区间的公共元素
template <class _InputIter1, class _InputIter2, class _OutputIter>
_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
_OutputIter __result) {
while (__first1 != __last1 && __first2 != __last2) {
if (*__first1 < *__first2) {
*__result = *__first1;
++__first1;
}
else if (*__first2 < *__first1) {
*__result = *__first2;
++__first2;
}
else {
*__result = *__first1;
++__first1;
++__first2;
}
++__result;
}
return copy(__first2, __last2, copy(__first1, __last1, __result));
}
///得到两个序列的交集
template <class _InputIter1, class _InputIter2, class _OutputIter>
_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
_OutputIter __result) {
while (__first1 != __last1 && __first2 != __last2)
if (*__first1 < *__first2)
++__first1;
else if (*__first2 < *__first1)
++__first2;
else {
*__result = *__first1;
++__first1;
++__first2;
++__result;
}
return __result;
}
///得到两个序列的差集
template <class _InputIter1, class _InputIter2, class _OutputIter>
_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
_OutputIter __result) {
while (__first1 != __last1 && __first2 != __last2)
if (*__first1 < *__first2) {
*__result = *__first1;
++__first1;
++__result;
}
else if (*__first2 < *__first1)
++__first2;
else {
++__first1;
++__first2;
}
return copy(__first1, __last1, __result);
}
///两个集合的对称差集
template <class _InputIter1, class _InputIter2, class _OutputIter>
_OutputIter
set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
_OutputIter __result) {
while (__first1 != __last1 && __first2 != __last2)
if (*__first1 < *__first2) {
*__result = *__first1;
++__first1;
++__result;
}
else if (*__first2 < *__first1) {
*__result = *__first2;
++__first2;
++__result;
}
else {
++__first1;
++__first2;
}
return copy(__first2, __last2, copy(__first1, __last1, __result));
}
/// next_permutation and prev_permutation
///在当前序列中,从尾端往前寻找两个相邻元素,前一个记为*__i,后一个记为*__ii,
///而且满足*__i < *__ii。然后再从尾端寻找还有一个元素*__j,假设满足*__j,即将
///第__i个元素与第__j个元素对调,并将第__ii个元素之后(包含__ii)的全部元素颠倒排序,
///即求出下一个序列了。
template <class _BidirectionalIter>
bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
if (__first == __last)
return false;
_BidirectionalIter __i = __first;
++__i;
if (__i == __last)
return false;
__i = __last;
--__i;
for(;;) {
_BidirectionalIter __ii = __i;
--__i;
if (*__i < *__ii) {
_BidirectionalIter __j = __last;
while (!(*__i < *--__j))
{}
iter_swap(__i, __j);
reverse(__ii, __last);
return true;
}
if (__i == __first) {
reverse(__first, __last);
return false;
}
}
}
template <class _BidirectionalIter>
bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
if (__first == __last)
return false;
_BidirectionalIter __i = __first;
++__i;
if (__i == __last)
return false;
__i = __last;
--__i;
for(;;) {
_BidirectionalIter __ii = __i;
--__i;
if (*__ii < *__i) {
_BidirectionalIter __j = __last;
while (!(*--__j < *__i))
{}
iter_swap(__i, __j);
reverse(__ii, __last);
return true;
}
if (__i == __first) {
reverse(__first, __last);
return false;
}
}
}
template <class _InputIter, class _ForwardIter>
_InputIter find_first_of(_InputIter __first1, _InputIter __last1,
_ForwardIter __first2, _ForwardIter __last2)
{
for ( ; __first1 != __last1; ++__first1)
for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
if (*__first1 == *__iter)
return __first1;
return __last1;
}
/// find_end, Search [first2, last2) as a subsequence in [first1, last1), and return
/// the *last* possible match. Note that find_end for bidirectional iterators
/// is much faster than for forward iterators.
/// find_end for forward iterators.
template <class _ForwardIter1, class _ForwardIter2>
_ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
_ForwardIter2 __first2, _ForwardIter2 __last2,
forward_iterator_tag, forward_iterator_tag)
{
if (__first2 == __last2)
return __last1;
else {
_ForwardIter1 __result = __last1;
while (1) {
_ForwardIter1 __new_result
= search(__first1, __last1, __first2, __last2);
if (__new_result == __last1)
return __result;
else {
__result = __new_result;
__first1 = __new_result;
++__first1;
}
}
}
}
/// find_end for bidirectional iterators.
template <class _BidirectionalIter1, class _BidirectionalIter2>
_BidirectionalIter1
__find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
_BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
bidirectional_iterator_tag, bidirectional_iterator_tag)
{
typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
_RevIter1 __rlast1(__first1);
_RevIter2 __rlast2(__first2);
///使用reverse_iterator查找
_RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
_RevIter2(__last2), __rlast2);
if (__rresult == __rlast1)
return __last1;
else {
///找到出现序列的一个元素的位置
_BidirectionalIter1 __result = __rresult.base();
advance(__result, -distance(__first2, __last2));
return __result;
}
}
/// is_heap, a predicate testing whether or not a range is
/// a heap. This function is an extension, not part of the C++
/// standard.
template <class _RandomAccessIter, class _Distance>
bool __is_heap(_RandomAccessIter __first, _Distance __n)
{
_Distance __parent = 0;
for (_Distance __child = 1; __child < __n; ++__child) {
if (__first[__parent] < __first[__child]) ///子节点不得大于其父节点
return false;
if ((__child & 1) == 0) ///__child为偶数
++__parent;
}
return true;
}