CHAPTER4-21.cpp
上传用户:fjc899
上传日期:2007-07-03
资源大小:187k
文件大小:2k
源码类别:

STL

开发平台:

C/C++

  1. //【实例4-21:利用指针技术对容器进行赋值操作实例】
  2. #include "stl.h"
  3. #include <iostream.h>
  4. using namespace std;
  5. // Let's say you want to put pointers to X into multiple STLcontainers.
  6. class X 
  7. {
  8. public:
  9.     X(int i) : i_(i) { ; }
  10.     X(const X& x) : i_(x.i_) { }
  11.     ~X() { }
  12.     X& operator= (const X& x) { i_ = x.i_; }
  13.     int operator()() const { return i_; }
  14. private:
  15.     int i_;
  16. };
  17. bool operator== (const X& x1, const X& x2) { return x1() == x2(); }
  18. bool operator< (const X& x1, const X& x2) {   return x1() < x2(); }
  19. // Define a simple wrapper class to put into STLcontainers. This one simple wraps X.
  20. class XPtrWrapper 
  21. {
  22. public:
  23.     XPtrWrapper(X* x = 0) : x_(x) { }
  24.     XPtrWrapper(const XPtrWrapper& xw) : x_(xw.x_) { }
  25.     ~XPtrWrapper() { }
  26.     //XPtrWrapper& operator= (const XPtrWrapper& xw) { x_ = xw.x_; }
  27.     const X* operator() () const { return x_; }
  28.     X* operator() () { return x_; }
  29. private:
  30.     X* x_;
  31. };
  32. bool operator== (const XPtrWrapper& xw1, const XPtrWrapper& xw2) 
  33. {   return (xw1.operator()() && xw2.operator()()) ? *xw1() == *xw2() : false;  }
  34. bool operator< (const XPtrWrapper& xw1, const XPtrWrapper& xw2) 
  35. {    return (xw1() && xw2()) ? *xw1() < *xw2() : false;  }
  36. void print(const XPtrWrapper& xw) 
  37. {    cout << " " << (*xw())();  }
  38. int main(int, char*[]) 
  39. {   XPtrWrapper bucket[5];
  40.     for(int i = 0; i < 5; ++i) { bucket[i] = XPtrWrapper(new X(i * i)); }
  41.     random_shuffle(bucket, bucket + 5);
  42.     list<XPtrWrapper> list1;
  43.     copy(bucket, bucket + 5, back_insert_iterator<list<XPtrWrapper> > (list1));
  44.     cout << "List of XPtrWrapper: (";
  45.     for_each(list1.begin(), list1.end(), print);
  46.     cout << ")" << endl;
  47.     // now put these XPtrWrappers into a set. Note that I can use greater since I've defined operator> for it.
  48.     set<XPtrWrapper, greater<XPtrWrapper> > set1;
  49. /*    copy(list1.begin(), list1.end(), 
  50.         insert_iterator<set<XPtrWrapper, greater<XPtrWrapper> > >(set1, set1.begin()) );
  51. */
  52.     cout << "Set of XPtrWrapper : [";
  53.     for_each(set1.begin(), set1.end(), print);
  54.     cout << "]" << endl;
  55.     // now put these integers into a deque. 
  56.     deque<XPtrWrapper> deque1;
  57.     copy(list1.begin(), list1.end(), back_insert_iterator<deque<XPtrWrapper> > (deque1) );
  58.     cout << "Deque of XPtrWrapper : (";
  59.     for_each(deque1.begin(), deque1.end(), print);
  60.     cout << ")" << endl;
  61.     return 0;
  62. }