fork download
  1. #include <vector>
  2. #include <algorithm>
  3. #include <iterator>
  4. #include <functional>
  5. #include <iostream>
  6.  
  7. using namespace std;
  8.  
  9. struct Data {
  10. Data(size_t l, size_t h) : iLo(l), iHi(h) {}
  11.  
  12. size_t iLo;
  13. size_t iHi;
  14. };
  15.  
  16. template <class Impl>
  17. struct MyIter : public iterator<random_access_iterator_tag, size_t>
  18. {
  19. typedef vector<Data>::iterator Base;
  20. Base base;
  21.  
  22. MyIter(Base i) : base(i) {}
  23.  
  24. bool operator !=(const Impl &rhs) const {
  25. return base != rhs.base;
  26. }
  27. bool operator ==(const Impl &rhs) const {
  28. return base == rhs.base;
  29. }
  30. bool operator <(const Impl &rhs) const {
  31. return base < rhs.base;
  32. }
  33.  
  34. ptrdiff_t operator -(const Impl &rhs) const {
  35. return base - rhs.base;
  36. }
  37.  
  38. Impl operator +(ptrdiff_t i) const {
  39. return base + i;
  40. }
  41. Impl operator -(ptrdiff_t i) const {
  42. return base - i;
  43. }
  44. Impl &operator ++() {
  45. ++base;
  46. return static_cast<Impl&>(*this);
  47. }
  48. Impl &operator --() {
  49. --base;
  50. return static_cast<Impl&>(*this);
  51. }
  52. };
  53.  
  54. struct MyLoIter : public MyIter<MyLoIter>
  55. {
  56. MyLoIter(Base i) : MyIter(i) {}
  57.  
  58. size_t &operator [](int i) {
  59. return base[i].iLo;
  60. }
  61. size_t &operator *() {
  62. return base->iLo;
  63. }
  64. };
  65.  
  66. struct MyHiIter : public MyIter<MyHiIter>
  67. {
  68. MyHiIter(Base i) : MyIter(i) {}
  69.  
  70. size_t &operator [](int i) {
  71. return base[i].iHi;
  72. }
  73. size_t &operator *() {
  74. return base->iHi;
  75. }
  76. };
  77.  
  78. int main() {
  79. vector<Data> data;
  80. data.push_back(Data(1, 3));
  81. data.push_back(Data(4, 66));
  82. data.push_back(Data(0, 0));
  83. data.push_back(Data(0, 1));
  84.  
  85. sort(MyLoIter(data.begin()), MyLoIter(data.end()), less<size_t>());
  86. sort(MyHiIter(data.begin()), MyHiIter(data.end()), greater<size_t>());
  87.  
  88. for (vector<Data>::iterator i = data.begin(); i != data.end(); ++i) {
  89. cout << i->iLo << "\t" << i->iHi << endl;
  90. }
  91.  
  92. return 0;
  93. }
  94.  
Success #stdin #stdout 0s 3032KB
stdin
Standard input is empty
stdout
0	66
0	3
1	1
4	0