//----------------------------------------------------------------------------- // vecop.h //----------------------------------------------------------------------------- #ifndef VECOP_H #define VECOP_H //----------------------------------------------------------------------------- #include // ostream istream #include // vector #include // plus minus multiplies divides #include // inner_product //----------------------------------------------------------------------------- // vector + vector //----------------------------------------------------------------------------- template vector operator+(const vector& v1, const vector& v2) { vector tmp = v1; transform(tmp.begin(), tmp.end(), v2.begin(), tmp.begin(), plus()); return tmp; } template vector operator-(const vector& v1, const vector& v2) { vector tmp = v1; transform(tmp.begin(), tmp.end(), v2.begin(), tmp.begin(), minus()); return tmp; } template T operator*(const vector& v1, const vector& v2) { return inner_product(v1.begin(), v1.end(), v2.begin(), static_cast(0)); } template T operator/(const vector& v1, const vector& v2) { return inner_product(v1.begin(), v1.end(), v2.begin(), static_cast(0), plus(), divides()); } //----------------------------------------------------------------------------- // vector += vector //----------------------------------------------------------------------------- template vector& operator+=(vector& v1, const vector& v2) { transform(v1.begin(), v1.end(), v2.begin(), v1.begin(), plus()); return v1; } template vector& operator-=(vector& v1, const vector& v2) { transform(v1.begin(), v1.end(), v2.begin(), v1.begin(), minus()); return v1; } //----------------------------------------------------------------------------- // vector + number //----------------------------------------------------------------------------- template vector operator+(const vector& a, const B& b) { vector tmp = a; transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(plus(), b)); return tmp; } template vector operator-(const vector& a, const B& b) { vector tmp = a; transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(minus(), b)); return tmp; } template vector operator*(const vector& a, const B& b) { vector tmp = a; transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(multiplies(), b)); return tmp; } template vector operator/(const vector& a, const B& b) { vector tmp = a; transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(divides(), b)); return tmp; } //----------------------------------------------------------------------------- // number + vector //----------------------------------------------------------------------------- template vector operator+(const B& b, const vector& a) { vector tmp = a; transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(plus(), b)); return tmp; } template vector operator-(const B& b, const vector& a) { vector tmp(a.size(), b); transform(tmp.begin(), tmp.end(), a.begin(), tmp.begin(), minus()); return tmp; } template vector operator*(const B& b, const vector& a) { vector tmp = a; transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(multiplies(), b)); return tmp; } template vector operator/(const B& b, const vector& a) { vector tmp(a.size(), b); transform(tmp.begin(), tmp.end(), a.begin(), tmp.begin(), divides()); return tmp; } //----------------------------------------------------------------------------- // vector += number //----------------------------------------------------------------------------- template vector& operator+=(vector& a, const B& b) { transform(a.begin(), a.end(), a.begin(), bind2nd(plus(), b)); return a; } template vector& operator-=(vector& a, const B& b) { transform(a.begin(), a.end(), a.begin(), bind2nd(minus(), b)); return a; } template vector& operator*=(vector& a, const B& b) { transform(a.begin(), a.end(), a.begin(), bind2nd(multiplies(), b)); return a; } template vector& operator/=(vector& a, const B& b) { transform(a.begin(), a.end(), a.begin(), bind2nd(divides(), b)); return a; } //----------------------------------------------------------------------------- // I/O //----------------------------------------------------------------------------- template ostream& operator<<(ostream& os, const vector& v) { os << '<'; if (v.size()) { copy(v.begin(), v.end() - 1, ostream_iterator(os, " ")); os << v.back(); } return os << '>'; } template istream& operator>>(istream& is, vector& v) { v.clear(); char c; is >> c; if (!is || c != '<') is.setstate(ios::failbit); else { T t; do { is >> c; if (is && c!= '>') { is.putback(c); is >> t; if (is) v.push_back(t); } } while (is && c != '>'); } return is; } //----------------------------------------------------------------------------- // euclidean_distance //----------------------------------------------------------------------------- template T euclidean_distance(const vector& v1, const vector& v2) { T sum = 0, tmp; for (unsigned i = 0; i < v1.size(); ++i) { tmp = v1[i] - v2[i]; sum += tmp * tmp; } return sqrt(sum); } //----------------------------------------------------------------------------- #endif VECOP_H