#ifndef OPTVEC_HPP #define OPTVEC_HPP #include #include namespace opt_utilities { template class optvec :public std::vector { public: optvec() {} explicit optvec(size_t s) :std::vector(s) {} optvec(const std::vector& rhs) :std::vector(rhs) {} optvec& operator=(const optvec& rhs) { //dynamic_cast&>(*this).operator=(rhs); std::vector::operator=(rhs); return *this; } public: operator std::vector& () { return dynamic_cast&>(*this); } operator const std::vector& ()const { return dynamic_cast&>(*this); } }; template optvec operator+(const optvec& x1,const optvec& x2) { optvec result(x1); for(size_t i=0;i!=x1.size();++i) { result[i]=result[i]+x2.at(i); } return result; } template optvec operator-(const optvec& x1,const optvec& x2) { optvec result(x1); for(size_t i=0;i!=x1.size();++i) { result[i]=result[i]-x2.at(i); } return result; } template optvec operator*(const optvec& x1,const optvec& x2) { optvec result(x1); for(size_t i=0;i!=x1.size();++i) { result[i]=result[i]*x2.at(i); } return result; } template optvec operator/(const optvec& x1,const optvec& x2) { optvec result(x1); for(size_t i=0;i!=x1.size();++i) { result[i]=result[i]/x2.at(i); } return result; } template T sum(const optvec& x) { T result=0; for(size_t i=0;i!=x.size();++i) { result+=x[i]; } return result; } template bool operator<(const optvec& x1,const optvec& x2) { for(size_t i=0;i!=x1.size();++i) { if(x1[i]!=x2[i]) { return x1[i]