#include <complex>
#include <iostream>
#include <ostream>
class Vector
{
public:
class iterator;
class const_iterator;
// ссылка на пару элементов по индексу
class reference
{
friend class Vector::iterator;
Vector& vector;
size_t i;
reference(Vector& vector, size_t i) : vector(vector), i(i) {}
public:
// ведёт себя как complex<double>
operator std::complex<double>() const
{
return std::complex<double>(vector.real[i], vector.imag[i]);
}
// и умеет присваивать complex<double> в себя
reference& operator=(const std::complex<double>& x)
{
vector.real[i] = x.real();
vector.imag[i] = x.imag();
return *this;
}
reference& operator=(const reference& x)
{
vector.real[i] = x.vector.real[x.i];
vector.imag[i] = x.vector.imag[x.i];
return *this;
}
};
class const_reference
{
friend class Vector::const_iterator;
const Vector& vector;
size_t i;
const_reference(const Vector& vector, size_t i) : vector(vector), i(i) {}
public:
// ведёт себя как complex<double>
operator std::complex<double>() const
{
return std::complex<double>(vector.real[i], vector.imag[i]);
}
};
class iterator
{
friend class Vector;
Vector& vector;
size_t i;
public:
iterator(Vector& vector, size_t i) : vector(vector), i(i) {}
reference operator*() { return reference(vector, i); }
iterator& operator++() { i++; return *this; }
iterator operator++(int) { auto ret = *this; i++; return ret; }
iterator(const iterator& r) : vector(r.vector), i(r.i) { }
bool operator == (const iterator& other) { return &vector == &other.vector && i == other.i; }
bool operator != (const iterator& other) { return &vector != &other.vector || i != other.i; }
};
class const_iterator
{
friend class Vector;
const Vector& vector;
size_t i;
public:
const_iterator(const Vector& vector, size_t i) : vector(vector), i(i) {}
const_reference operator*() { return const_reference(vector, i); }
const_iterator& operator++() { i++; return *this; }
const_iterator operator++(int) { auto ret = *this; i++; return ret; }
const_iterator(const const_iterator& r) : vector(r.vector), i(r.i) { }
bool operator == (const const_iterator& other) { return &vector == &other.vector && i == other.i; }
bool operator != (const const_iterator& other) { return &vector != &other.vector || i != other.i; }
};
iterator begin()
{
return iterator(*this, 0);
}
const_iterator begin() const
{
return const_iterator(*this, 0);
}
iterator end()
{
return iterator(*this, size);
}
const_iterator end() const
{
return const_iterator(*this, size);
}
Vector(double* r, double* i, size_t size) : real(r), imag(i), size(size) {}
private:
size_t size;//размер вектора
double* real;//массив, хранящий действительную часть
double* imag;//массив, хранящий мнимую часть
};
std::ostream& operator << (std::ostream& os, const Vector::reference& r)
{
return os << static_cast<std::complex<double>>(r);
}
std::ostream& operator << (std::ostream& os, const Vector::const_reference& r)
{
return os << static_cast<std::complex<double>>(r);
}
int main(int argc, char* argv[])
{
double r[] = { 0.0, 1.0 };
double i[] = { 0.0, 2.0 };
Vector vec(r, i, 2);
for (auto val : vec)
std::cout << val;
return 0;
}