正文

traits 使用特性2008-05-21 22:45:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/vfdff/35316.html

分享到:

//  VC6.0 2008/5/20 #include "iostream"using namespace std; class SimpleCompareTrait { };class ComplexCompareTrait { }; template<class T> class ComplexCompare{public: typedef T ValueType; typedef ComplexCompareTrait CompareTrait;}; template<class T> class SimpleCompare{public: typedef T ValueType; typedef SimpleCompareTrait CompareTrait;}; template<class T, class Iterator, class Compare>Iterator __LowerBound(Iterator first, Iterator last, T val,       Compare comp, ComplexCompareTrait){ size_t len = 0; size_t half; Iterator middle;  len = last - first; while (len > 0) {  half = len >> 1;  middle = first;  middle += half;  if (comp(*middle, val) < 0)  {   first = middle;   ++first;   len = len - half - 1;  } else   len = half; } return first;} template<class T, class Iterator, class Compare>Iterator __LowerBound(Iterator first, Iterator last, T val,       Compare comp, SimpleCompareTrait){ size_t len = 0; size_t half; Iterator middle;  len = last - first; while (len > 0) {  half = len >> 1;  middle = first;  middle += half;  if (comp(*middle, val))  {   first = middle;   ++first;   len = len - half - 1;  } else   len = half; } return first;} template<class T, class Iterator, class Compare>Iterator LowerBound(Iterator first, Iterator last, T val, Compare comp){ return __LowerBound(first, last, val, comp, Compare::CompareTrait());} template<class T, class Iterator, class Compare>Iterator __BinSearch(Iterator first, Iterator last, T val,      Compare comp, ComplexCompareTrait){ size_t len = 0; size_t half; Iterator middle;  len = last - first; while (len > 0) {  half = len >> 1;  middle = first;  middle += half;  int iComp = comp(*middle, val);  if (iComp < 0)  {   first = middle;   ++first;   len = len - half - 1;  }  else if (iComp > 0)  {   len = half;  } else   return middle; } return last;} template<class T, class Iterator, class Compare>Iterator __BinSearch(Iterator first, Iterator last, T val,      Compare comp, SimpleCompareTrait){ size_t len = 0; size_t half; Iterator middle;  len = last - first; while (len > 0) {  half = len >> 1;  middle = first;  middle += half;  if (comp(*middle, val))  {   first = middle;   ++first;   len = len - half - 1;  }  else if (comp(val, *middle))  {   len = half;  } else   return middle; } return last;} template<class T, class Iterator, class Compare>Iterator BinSearch(Iterator first, Iterator last, T val, Compare comp){ return __BinSearch(first, last, val, comp, Compare::CompareTrait());} template<class T> class TheSimpleCompare : public SimpleCompare<T>{public: bool operator()(const T& lv, const T& rv) const { return lv < rv; }};template<class T> class TheComplexCompare : public ComplexCompare<T>{public: int operator()(const T& lv, const T& rv) const { return lv - rv; }}; typedef TheSimpleCompare<int> SimpleIntCompare;typedef TheComplexCompare<int> ComplexIntCompare;/*class SimpleIntCompare : public SimpleCompare<int>{public:bool operator()(int lv, int rv) const{ return lv < rv; } };class ComplexIntCompare : public ComplexCompare<int>{public:int operator()(int lv, int rv) const{ return lv - rv; } };*/ #define dimof(x) (sizeof(x)/sizeof(x[0])) int main(int argc, char* argv[]){ int  val = 8; int  tab[] = { 1, 2, 3, 4, 5, 6, 7, 9, 10, 10000};  int  *slow = LowerBound(tab, tab + dimof(tab) - 1, val, SimpleIntCompare()); int  *clow = LowerBound(tab, tab + dimof(tab) - 1, val, ComplexIntCompare());  int  *s = BinSearch(tab, tab + dimof(tab) - 1, val, SimpleIntCompare()); int  *c = BinSearch(tab, tab + dimof(tab) - 1, val, ComplexIntCompare());  cout << "*slow = " << *slow << ", *clow = " << *clow << endl; cout << "*s = " << *s << ", *c = " << *c << endl   << endl;  return 0;}

阅读(5289) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册