Chinaunix首页 | 论坛 | 博客
  • 博客访问: 526530
  • 博文数量: 235
  • 博客积分: 1209
  • 博客等级: 少尉
  • 技术积分: 1417
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 19:59
文章分类

全部博文(235)

文章存档

2012年(107)

2011年(128)

分类:

2011-12-29 07:31:38

最近在看sgi stl 3.3的代码,写一些感想和要点,就算是做读书笔记吧。
 
之前关于Concept部分的代码没太关注,仅仅把重点放到数据结构和算法的具体实现上,sgi stl的算法的代码总体感觉冗余的code很多,今天仔细看了其中的一个:
 
  1. template <class _ForwardIter>
  2. bool is_sorted(_ForwardIter __first, _ForwardIter __last)
  3. {
  4.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  5.   __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
  6.                  _LessThanComparable);
  7.   if (__first == __last)
  8.     return true;

  9.   _ForwardIter __next = __first;
  10.   for (++__next; __next != __last; __first = __next, ++__next) {
  11.     if (*__next < *__first)
  12.       return false;
  13.   }

  14.   return true;
  15. }

  16. template <class _ForwardIter, class _StrictWeakOrdering>
  17. bool is_sorted(_ForwardIter __first, _ForwardIter __last,
  18.                _StrictWeakOrdering __comp)
  19. {
  20.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  21.   __STL_BINARY_FUNCTION_CHECK(_StrictWeakOrdering, bool,
  22.         typename iterator_traits<_ForwardIter>::value_type,
  23.         typename iterator_traits<_ForwardIter>::value_type);
  24.   if (__first == __last)
  25.     return true;

  26.   _ForwardIter __next = __first;
  27.   for (++__next; __next != __last; __first = __next, ++__next) {
  28.     if (__comp(*__next, *__first))
  29.       return false;
  30.   }

  31.   return true;
  32. }

这个is_sorted函并不是C++ standard的一部分,拿它做例子只是因为它简单。

含义很清晰,就是判断[first, last)这个区间内部是否是有序的。第二个版本用户可以自定义比较函数。

为什么sgi stl不基于后者来实现前者呢?我把注意力放到了红色的两行,也就是_LessThanComparable concept的定义和__STL_BINARY_FUNCTION_CHECK的实现

__STL_REQUIRES的定义:

  1. #define __STL_REQUIRES(__type_var, __concept) \
  2. do { \
  3.   void (*__x)( __type_var ) = __concept##_concept_specification< __type_var >\
  4.     ::__concept##_requirement_violation; __x = __x; } while (0)

这个宏通过显式定义模板参数来产生一个具体类型的定义,对于_LessThanComparable这个concept来说,就是定义了_LessThanComparable_concept_specification<__type_var>这个具体类型。

值得一提的是,上述代码仅仅是使编译器产生该类的定义,并对其进行语法检查。编译期就可以将上述的代码优化掉,不会影响运行期的效率。

下面是_LessThanComparable concept的声明:

  1. /* LessThanComparable Requirements */
  2. template <class _Type>
  3. struct _LessThanComparable_concept_specification {
  4.   static void _LessThanComparable_requirement_violation(_Type __a) {
  5.     _STL_ERROR::__less_than_comparable_requirement_violation(__a, __a);
  6.   }
  7. };

_STL_ERROR::__less_than_comparable_requirement_violation的定义:

  1. template <class _Type>
  2.   static _Type
  3.   __less_than_comparable_requirement_violation(_Type __a, _Type __b) {
  4.     if (__a < __b || __a > __b || __a <= __b || __a >= __b) return __a;
  5.     return __b;
  6.   }

返回值不重要,关键是类型_Type需要定义以上四种比较运算符。从这个可以看出_LessThanComparable concept的定义式超出了仅仅定义less这样的字面要求。

__STL_BINARY_FUNCTION_CHECK的实现相对简单,仅仅是判定制定的函数/仿函数定义符合后面参数制定的类型,这里就不列出了。

这样看起来,第一个is_sorted可以基于第二个版本实现,大体上是这样:

  1. template <class ForwardIter>
  2. bool is_sorted(ForwardIter first, ForwardIter last)
  3. {
  4.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  5.   __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
  6.                  _LessThanComparable);

  7.     return is_sorted(first, last, std::less<typename std::iterator_traits<ForwardIter>::value_type>());
  8. }
阅读(829) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~