fork(2) download
  1. #include <algorithm>
  2. #include <iostream>
  3.  
  4. class SIter {
  5. public:
  6.  
  7.  
  8. SIter(int* aIter, double* bIter) : aIter(aIter), bIter(bIter) {}
  9.  
  10. // we move to next position is just moving both:
  11. SIter& operator ++() {
  12. ++aIter; ++bIter;
  13. return *this;
  14. }
  15. SIter operator ++(int) {
  16. SIter rv = *this;
  17. ++aIter; ++bIter;
  18. return rv;
  19. }
  20. SIter& operator --() {
  21. --aIter; --bIter;
  22. return *this;
  23. }
  24. SIter operator --(int) {
  25. SIter rv = *this;
  26. --aIter; --bIter;
  27. return rv;
  28. }
  29. SIter operator + (std::ptrdiff_t cc) const
  30. {
  31. SIter rv = *this;
  32. rv.aIter += cc;
  33. rv.bIter += cc;
  34. return rv;
  35. }
  36. SIter operator - (std::ptrdiff_t cc) const
  37. {
  38. SIter rv = *this;
  39. rv.aIter -= cc;
  40. rv.bIter -= cc;
  41. return rv;
  42. }
  43. std::ptrdiff_t operator - (SIter other) const
  44. {
  45. return aIter - other.aIter;
  46. }
  47. struct value_type {
  48. int a; double b;
  49. bool operator < (const value_type& other) const {
  50. return a < other.a; // this is the place where way of sorting is defined!!!!
  51. }
  52. };
  53. struct reference {
  54. int* a;
  55. double* b;
  56. reference& operator = (const value_type& o)
  57. {
  58. *a = o.a;
  59. *b = o.b;
  60. return *this;
  61. }
  62. operator value_type() const {
  63. value_type rv = { *a, *b };
  64. return rv;
  65. }
  66. reference& operator = (const reference& other)
  67. {
  68. *a = *other.a;
  69. *b = *other.b;
  70. return *this;
  71. }
  72. bool operator < (const reference& other) const {
  73. return *a < *other.a;
  74. }
  75. bool operator < (const value_type& other) const {
  76. return *a < other.a;
  77. }
  78. };
  79.  
  80. reference operator * () {
  81. reference rv = { aIter, bIter };
  82. return rv;
  83. }
  84. bool operator == (const SIter& other) const
  85. {
  86. return aIter == other.aIter; // don't need to compare bIter - shall be in sync
  87. }
  88. bool operator != (const SIter& other) const
  89. {
  90. return aIter != other.aIter; // don't need to compare bIter - shall be in sync
  91. }
  92. bool operator < (const SIter& other) const
  93. {
  94. return aIter < other.aIter; // don't need to compare bIter - shall be in sync
  95. }
  96. // I bet you don't need pointer operator -> ()
  97. typedef std::random_access_iterator_tag iterator_category;
  98. typedef std::ptrdiff_t difference_type;
  99. typedef reference pointer;
  100.  
  101.  
  102. private:
  103. int* aIter;
  104. double* bIter;
  105. };
  106.  
  107.  
  108.  
  109.  
  110.  
  111. int main() {
  112. int a[10] = {10,9,8,7,6,5,4,3,2,1};
  113. double b[10] = {1,2,3,4,5,6,7,8,9,10};
  114.  
  115. SIter beginIter(a, b);
  116. SIter endIter(a + 10, b + 10);
  117.  
  118. std::sort(beginIter, endIter);
  119. for (int i = 0; i < 10; ++i) {
  120. std::cout << a[i] << "->" << b[i] << "\n";
  121. }
  122. }
  123.  
  124.  
Success #stdin #stdout 0s 2900KB
stdin
Standard input is empty
stdout
1->10
2->9
3->8
4->7
5->6
6->5
7->4
8->3
9->2
10->1