fork download
  1. #include <complex>
  2. #include <iostream>
  3. #include <ostream>
  4.  
  5. class Vector
  6. {
  7. public:
  8. class iterator;
  9. class const_iterator;
  10. // ссылка на пару элементов по индексу
  11. class reference
  12. {
  13. friend class Vector::iterator;
  14. Vector& vector;
  15. size_t i;
  16. reference(Vector& vector, size_t i) : vector(vector), i(i) {}
  17. public:
  18. // ведёт себя как complex<double>
  19. operator std::complex<double>() const
  20. {
  21. return std::complex<double>(vector.real[i], vector.imag[i]);
  22. }
  23.  
  24. // и умеет присваивать complex<double> в себя
  25. reference& operator=(const std::complex<double>& x)
  26. {
  27. vector.real[i] = x.real();
  28. vector.imag[i] = x.imag();
  29. return *this;
  30. }
  31. reference& operator=(const reference& x)
  32. {
  33. vector.real[i] = x.vector.real[x.i];
  34. vector.imag[i] = x.vector.imag[x.i];
  35. return *this;
  36. }
  37. };
  38.  
  39. class const_reference
  40. {
  41. friend class Vector::const_iterator;
  42. const Vector& vector;
  43. size_t i;
  44. const_reference(const Vector& vector, size_t i) : vector(vector), i(i) {}
  45. public:
  46. // ведёт себя как complex<double>
  47. operator std::complex<double>() const
  48. {
  49. return std::complex<double>(vector.real[i], vector.imag[i]);
  50. }
  51. };
  52.  
  53. class iterator
  54. {
  55. friend class Vector;
  56. Vector& vector;
  57. size_t i;
  58. public:
  59. iterator(Vector& vector, size_t i) : vector(vector), i(i) {}
  60. reference operator*() { return reference(vector, i); }
  61. iterator& operator++() { i++; return *this; }
  62. iterator operator++(int) { auto ret = *this; i++; return ret; }
  63. iterator(const iterator& r) : vector(r.vector), i(r.i) { }
  64. bool operator == (const iterator& other) { return &vector == &other.vector && i == other.i; }
  65. bool operator != (const iterator& other) { return &vector != &other.vector || i != other.i; }
  66. };
  67.  
  68. class const_iterator
  69. {
  70. friend class Vector;
  71. const Vector& vector;
  72. size_t i;
  73. public:
  74. const_iterator(const Vector& vector, size_t i) : vector(vector), i(i) {}
  75. const_reference operator*() { return const_reference(vector, i); }
  76. const_iterator& operator++() { i++; return *this; }
  77. const_iterator operator++(int) { auto ret = *this; i++; return ret; }
  78. const_iterator(const const_iterator& r) : vector(r.vector), i(r.i) { }
  79. bool operator == (const const_iterator& other) { return &vector == &other.vector && i == other.i; }
  80. bool operator != (const const_iterator& other) { return &vector != &other.vector || i != other.i; }
  81. };
  82.  
  83. iterator begin()
  84. {
  85. return iterator(*this, 0);
  86. }
  87.  
  88. const_iterator begin() const
  89. {
  90. return const_iterator(*this, 0);
  91. }
  92.  
  93. iterator end()
  94. {
  95. return iterator(*this, size);
  96. }
  97.  
  98. const_iterator end() const
  99. {
  100. return const_iterator(*this, size);
  101. }
  102.  
  103. Vector(double* r, double* i, size_t size) : real(r), imag(i), size(size) {}
  104.  
  105. private:
  106. size_t size;//размер вектора
  107. double* real;//массив, хранящий действительную часть
  108. double* imag;//массив, хранящий мнимую часть
  109. };
  110.  
  111. std::ostream& operator << (std::ostream& os, const Vector::reference& r)
  112. {
  113. return os << static_cast<std::complex<double>>(r);
  114. }
  115.  
  116. std::ostream& operator << (std::ostream& os, const Vector::const_reference& r)
  117. {
  118. return os << static_cast<std::complex<double>>(r);
  119. }
  120.  
  121. int main(int argc, char* argv[])
  122. {
  123. double r[] = { 0.0, 1.0 };
  124. double i[] = { 0.0, 2.0 };
  125. Vector vec(r, i, 2);
  126. for (auto val : vec)
  127. std::cout << val;
  128. return 0;
  129. }
  130.  
Success #stdin #stdout 0s 3412KB
stdin
Standard input is empty
stdout
(0,0)(1,2)