#pragma once #include #include #include namespace linalg { class Vector { public: Vector() = default; explicit Vector(std::size_t n); Vector(std::size_t n, double value); Vector(std::initializer_list values); [[nodiscard]] std::size_t size() const noexcept; [[nodiscard]] bool empty() const noexcept; double& operator[](std::size_t i); const double& operator[](std::size_t i) const; void fill(double value); double* data() noexcept; const double* data() const noexcept; auto begin() noexcept { return data_.begin(); } auto end() noexcept { return data_.end(); } auto begin() const noexcept { return data_.begin(); } auto end() const noexcept { return data_.end(); } auto cbegin() const noexcept { return data_.cbegin(); } auto cend() const noexcept { return data_.cend(); } private: void check_index(std::size_t i) const; std::vector data_; }; Vector operator+(const Vector& lhs, const Vector& rhs); Vector operator-(const Vector& lhs, const Vector& rhs); Vector operator*(const Vector& v, double scalar); Vector operator*(double scalar, const Vector& v); double dot(const Vector& lhs, const Vector& rhs); } // namespace linalg