Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7206
  • 博文数量: 2
  • 博客积分: 50
  • 博客等级: 民兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-25 15:40
文章分类

全部博文(2)

文章存档

2012年(2)

我的朋友

分类: C/C++

2012-02-25 16:02:37


快速排序是一种在串行下很高效的排序算法...

有没有想过在用C++编译时进行快速排序?

/*这是我很久以前发在stack overflow上的一个帖子.
发到这里吧...以后多用...
*/

  1. #include <iostream>

  2. using namespace std;

  3. template<int... vs>
  4. struct Seq
  5. {};
  6. template<int v1, int...vs>
  7. struct Seq<v1, vs...>{
  8. };


  9. template<typename newT, typename srcT>
  10. struct PushFront{
  11. };
  12. template<int vadded, int...vs>
  13. struct PushFront<Seq<vadded>, Seq<vs...>>{
  14.   typedef Seq<vadded, vs...> ResultType;
  15. };

  16. template<typename T>
  17. struct PopFront{
  18. };
  19. template<int v1, int...vs>
  20. struct PopFront<Seq<v1, vs...>>{
  21.   typedef Seq<vs...> RemaindType;
  22.   typedef Seq<v1> ResultType;
  23. };

  24. template<typename T1, typename T2>
  25. struct CatSeq{};
  26. template<int...v, int...us>
  27. struct CatSeq<Seq<v...>, Seq<us...>>{
  28.   typedef Seq< v..., us... > ResultType;
  29. };


  30. template<bool c, typename NewT, typename TrueClsT, typename FalseClsT>
  31. struct Classify{
  32. };
  33. template<typename NewT, typename TrueClsT, typename FalseClsT>
  34. struct Classify<true, NewT, TrueClsT, FalseClsT>{
  35.   typedef typename PushFront<NewT, TrueClsT>::ResultType NewTrueClsT;
  36.   typedef FalseClsT NewFalseClsT;
  37. };
  38. template<typename NewT, typename TrueClsT, typename FalseClsT>
  39. struct Classify<false, NewT, TrueClsT, FalseClsT>{
  40.   typedef TrueClsT NewTrueClsT;
  41.   typedef typename PushFront<NewT, FalseClsT>::ResultType NewFalseClsT;
  42. };

  43. template<typename T1, typename T2>
  44. struct Compare{};
  45. template<int v1, int v2>
  46. struct Compare<Seq<v1>, Seq<v2>>{
  47.   static const bool result=(v1>=v2);
  48. };


  49. template<typename AnchorT, typename SeqT, typename GESet, typename LSet>
  50. struct PartitionImpl{};
  51. template<typename GESet, typename LSet, int anchorv, int v1>
  52. struct PartitionImpl<Seq<anchorv>, Seq<v1>, GESet, LSet>{
  53.   static const bool isge=Compare<typename PopFront<Seq<v1>>::ResultType, Seq<anchorv>>::result;
  54.   typedef typename Classify<isge, Seq<v1>, GESet, LSet>::NewTrueClsT RstGESet;
  55.   typedef typename Classify<isge, Seq<v1>, GESet, LSet>::NewFalseClsT RstLSet;
  56. };
  57. template<typename GESet, typename LSet, int anchorv, int v1, int...vs>
  58. struct PartitionImpl<Seq<anchorv>, Seq<v1, vs...>, GESet, LSet>{
  59.   static const bool isge=Compare<typename PopFront<Seq<v1, vs...>>::ResultType, Seq<anchorv>>::result;
  60.   typedef typename Classify<isge, Seq<v1>, GESet, LSet>::NewTrueClsT TmpRstGESet;
  61.   typedef typename Classify<isge, Seq<v1>, GESet, LSet>::NewFalseClsT TmpRstLSet;
  62.   
  63.   typedef typename PartitionImpl<Seq<anchorv>, Seq<vs...>, TmpRstGESet, TmpRstLSet>::RstGESet RstGESet;
  64.   typedef typename PartitionImpl<Seq<anchorv>, Seq<vs...>, TmpRstGESet, TmpRstLSet>::RstLSet RstLSet;
  65. };


  66. template<typename T>
  67. struct Partition{
  68. };
  69. template<int v1, int v2, int...vs>
  70. struct Partition<Seq<v1, v2, vs...>>{
  71.   typedef Seq<v1> AnchorType;
  72.   typedef Seq<> GESet;
  73.   typedef Seq<> LSet;
  74.   typedef typename PartitionImpl<AnchorType, Seq<v1, v2, vs...>, GESet, LSet>::RstGESet RstGESet;
  75.   typedef typename PartitionImpl<AnchorType, Seq<v1, v2, vs...>, GESet, LSet>::RstLSet RstLSet;
  76. };

  77. //why introduce this? refer to Sort
  78. template<typename SrcT, typename GESet, typename LSet, template<typename > class SortOp>
  79. struct SortSub{
  80.   typedef typename SortOp<GESet>::ResultType TmpGESet2;
  81.   typedef typename SortOp<LSet>::ResultType TmpLSet2;
  82. };
  83. template<typename SrcT, typename LSet, template<typename> class SortOp>
  84. struct SortSub<SrcT, SrcT, LSet, SortOp>{
  85.   typedef SrcT TmpGESet2;
  86.   typedef typename SortOp<LSet>::ResultType TmpLSet2;
  87. };
  88. template<typename SrcT, typename GESet, template<typename> class SortOp>
  89. struct SortSub<SrcT, GESet, SrcT, SortOp>{
  90.   typedef typename SortOp<GESet>::ResultType TmpGESet2;
  91.   typedef SrcT TmpLSet2;
  92. };

  93. template<typename T>
  94. struct Sort;
  95. template<>
  96. struct Sort<Seq<>>{
  97.   typedef Seq<> ResultType;
  98. };
  99. template<int v>
  100. struct Sort< Seq<v> >{
  101.   typedef Seq<v> ResultType;
  102. };
  103. template<int v1, int...vs>
  104. struct Sort< Seq<v1, vs...> >{
  105.   typedef Seq<v1, vs...> SrcType;
  106.   typedef typename Partition< Seq<v1, vs...> >::RstGESet TmpGESet;
  107.   typedef typename Partition< Seq<v1, vs...> >::RstLSet TmpLSet;
  108.   
  109.   //to by pass the case SrcType <==> TmpGESet or SrcType <==> TmpLSet
  110.   typedef typename SortSub<SrcType, TmpGESet, TmpLSet, Sort>::TmpGESet2 TmpGESet2;
  111.   typedef typename SortSub<SrcType, TmpGESet, TmpLSet, Sort>::TmpLSet2 TmpLSet2;

  112.   typedef typename CatSeq<TmpGESet2, TmpLSet2>::ResultType ResultType;
  113. };


  114. void dumpSeqTypeImpl(Seq<> ){
  115. }
  116. template<int v1>
  117. void dumpSeqTypeImpl(Seq<v1> ){
  118.   cout<<v1<<" ";
  119. }
  120. template<int v1, int...vs>
  121. void dumpSeqTypeImpl(Seq<v1, vs...> ){
  122.   cout<<v1<<" ";
  123.   dumpSeqTypeImpl( Seq<vs...>() );
  124. }
  125. template<int...vs>
  126. void dumpSeqType(Seq<vs...> ){
  127.   cout<<"Seq type < ";
  128.   dumpSeqTypeImpl( Seq<vs...>() );
  129.   cout<<" >"<<endl;
  130. }

  131. /*
  132. This file define many macro like TEST_DATA_xxx
  133. if xxx==100, then it has 100 number
  134. */
  135. #include "qsort_input_in_compilation_time_input.txt"

  136. int main(){
  137.   //Seq<> s0;// aggregate ‘Seq<> s0’ has incomplete type and cannot be defined
  138.   Seq<1> s1;
  139.   Seq<1, 2> s2;

  140.   typedef Seq<5, 5, 5> TestType_SAME;
  141.   TestType_SAME same;
  142.   dumpSeqType( same );
  143.   typename Partition< TestType_SAME >::RstGESet _ts1;
  144.   typename Partition< TestType_SAME >::RstLSet _ts2;
  145.   dumpSeqType( _ts1 );
  146.   dumpSeqType( _ts2 );

  147. #if 1
  148.   typedef Seq<4, 7, 3, 9, 1, 2, 5, 5, 19, 5> TestType;
  149.   TestType s3;
  150.   dumpSeqType( s3 );
  151.   typename Partition< TestType >::RstGESet ts1;
  152.   typename Partition< TestType >::RstLSet ts2;
  153.   dumpSeqType( ts1 );
  154.   dumpSeqType( ts2 );

  155.   typename Sort<TestType>::ResultType so1;
  156.   dumpSeqType( so1 );
  157. #endif

  158.   //compilation line
  159.   //g++ -std=c++0x test_tmp_sort.cpp -DTEST_DATA_SET=TEST_DATA_100
  160. #if 1
  161.   typedef Seq<TEST_DATA_SET> TAdvanceType;
  162.   typename Sort<TAdvanceType>::ResultType soadvance;
  163.   dumpSeqType(soadvance);
  164. #endif

  165.   return 0;
  166. }

阅读(310) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~