#ifndef VECTOR_H #define VECTOR_H // Vector.h #include #include #include namespace Math { template class Vector { public: using iterator = typename std::vector::iterator; using const_iterator = typename std::vector::const_iterator; Vector(size_t size=0); Vector(std::initializer_list list); Vector(const Vector& v); Vector(Vector&& v); void push_back(const T& t); iterator begin(); iterator end(); const_iterator begin() const; const_iterator end() const; Vector& operator=(const Vector& v); Vector& operator=(Vector&& v); void operator+=(const Vector& v); Vector operator+(const Vector& v); void operator-=(const Vector& v); Vector operator-(const Vector& v); T& operator[](size_t pos); T operator[](size_t pos) const; bool operator==(const Vector& v) const; bool operator!=(const Vector& v) const; size_t size() const; T EuclidianSize() const; T MaxCompSize() const; operator std::vector(); private: std::vector vec_; }; template inline typename Vector::iterator Vector::begin() { return vec_.begin(); } template inline typename Vector::iterator Vector::end() { return vec_.end(); } template inline typename Vector::const_iterator Vector::begin() const { return vec_.begin(); } template inline typename Vector::const_iterator Vector::end() const { return vec_.end(); } template Vector::Vector(size_t size) : vec_(size) {} template Vector::Vector(std::initializer_list list) : vec_(list) {} template Vector::Vector(const Vector& v) : vec_(v.vec_) {} template Vector::Vector(Vector&& v) : vec_(std::move(v.vec_)) {} template void Vector::push_back(const T& t) { vec_.push_back(t); } template Vector& Vector::operator=(const Vector& v) { if (this == &v) return *this; for (auto elem : v) vec_.push_back(elem); } template Vector& Vector::operator=(Vector&& v) { if (this == &v) return *this; vec_ = std::move(v.vec_); return *this; } template void Vector::operator+=(const Vector& v) { if (size() != v.size()) throw(std::exception("unequal vector sizes")); for (size_t i = 0; i < size(); ++i) vec_[i] += v.vec_[i]; } template Vector Vector::operator+(const Vector& v) { Vector temp = *this; temp += v; return temp; } template void Vector::operator-=(const Vector& v) { if (size() != v.size()) throw(std::exception("unequal vector sizes")); for (size_t i = 0; i < size(); ++i) vec_[i] -= v.vec_[i]; } template Vector Vector::operator-(const Vector& v) { Vector temp = *this; temp -= v; return temp; } template T& Vector::operator[](size_t pos) { if (pos < 0 || size() <= pos) throw std::exception("index out of range"); return vec_[pos]; } template T Vector::operator[](size_t pos) const { if (pos < 0 || size() <= pos) throw std::exception("index out of range"); return vec_[pos]; } template bool Vector::operator==(const Vector& v) const { return vec_ == v.vec_; } template bool Vector::operator!=(const Vector& v) const { return vec_ != v.vec_; } template Vector operator*(T scale, const Vector& v) { Vector temp; for (auto elem : v) temp.push_back(scale*elem); return temp; } template Vector operator*(const Vector& v, T scale) { Vector temp; for (auto elem : v) temp.push_back(scale*elem); return temp; } template size_t Vector::size() const { return vec_.size(); } template T Vector::EuclidianSize() const { T size = 0; for (auto elem : *this) size += elem*elem; return std::sqrt(size); } template T Vector::MaxCompSize() const { T size = 0; for (auto elem : *this) if (std::abs(elem) > size) size = elem; return size; } template void show(const Vector& vec) { std::cout << "\n "; for (size_t i = 0; i < vec.size() - 1; ++i) std::cout << vec[i] << ", "; std::cout << vec[vec.size() - 1] << "\n"; } } #endif