// numeric.h
#ifndef _NUMERIC_H_ #define _NUMERIC_H_
#include <memory> // memcpy #include <iostream> // std:: using namespace std;
namespace numeric {
#define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) > (b)) ? (b) : (a))
template <class T> class expr_add { public: static inline T apply(const T& a, const T& b) { return a + b; } };
template <class T> class expr_sub { public: static inline T apply(const T& a, const T& b) { return a - b; } };
template <class T> class expr_mul { public: static inline T apply(const T& a, const T& b) { return a * b; } };
template <class T> class expr_div { public: static inline T apply(const T& a, const T& b) { return a / b; } };
template <class A, class B, class Op> class tpl_expr { const A& a_; const B& b_;
public: tpl_expr(const A& a, const B& b) : a_(a), b_(b) { }
inline double operator[](size_t i) const { return Op::apply(a_[i], b_[i]); } };
template <class B, class Op> class tpl_expr <double, B, Op> { const double& a_; const B& b_;
public: tpl_expr(const double& a, const B& b) : a_(a), b_(b) { }
inline double operator[](size_t i) const { return Op::apply(a_, b_[i]); } };
template <class B, class Op> class tpl_expr <int, B, Op> { const int& a_; const B& b_;
public: tpl_expr(const int& a, const B& b) : a_(a), b_(b) { }
inline double operator[](size_t i) const { return Op::apply(a_, b_[i]); } };
template <class A, class Op> class tpl_expr <A, double, Op> { const A& a_; const double& b_;
public: tpl_expr(const A& a, const double& b) : a_(a), b_(b) { }
inline double operator[](size_t i) const { return Op::apply(a_[i], b_); } };
template <class A, class Op> class tpl_expr <A, int, Op> { const A& a_; const int& b_;
public: tpl_expr(const A& a, const int& b) : a_(a), b_(b) { }
inline double operator[](size_t i) const { return Op::apply(a_[i], b_); } };
template <class A, class B> tpl_expr<A, B, expr_add<double> > operator+(const A& a, const B& b) { return tpl_expr<A, B, expr_add<double> >(a, b); }
template <class A, class B> tpl_expr<A, B, expr_sub<double> > operator-(const A& a, const B& b) { return tpl_expr<A, B, expr_sub<double> >(a, b); }
template <class A, class B> tpl_expr<A, B, expr_mul<double> > operator*(const A& a, const B& b) { return tpl_expr<A, B, expr_mul<double> >(a, b); }
template <class A, class B> tpl_expr<A, B, expr_div<double> > operator/(const A& a, const B& b) { return tpl_expr<A, B, expr_div<double> >(a, b); }
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
class vector { protected: size_t dim; double *ets;
public: // 由已知向量个数和向量元素数组来构造一个向量 vector(size_t n, const double* const pd) : dim(n) { ets = new double[dim]; memcpy(ets, pd, dim*sizeof(double)); } vector(size_t n = 0, double d = 0.0) : dim(n) { ets = new double[dim]; for (size_t i=0; i<dim; ++i) { ets[i] = d; } } vector(const vector& v) { dim = v.dim; ets = new double[dim]; memcpy(ets, v.ets, sizeof(double)*dim); }
vector& operator=(const vector& v) { if (this != &v) { // 防止自己拷贝自己 if (dim != v.dim) { exit(1); } memcpy(ets, v.ets, sizeof(double)*dim); } return *this; }
~vector() { delete[] ets; }
public: inline double operator[](size_t i) const { return ets[i]; } inline double& operator[](size_t i) { return ets[i]; }
public: size_t get_dim() const { return dim; }
double* get_ptr() const { return ets; }
double sum_element() const { double tmp = 0; for (size_t i=0; i<dim; ++i) { tmp += ets[i]; } return tmp; }
double min_element() const { double tmp = ets[0]; for (size_t i=0; i<dim; ++i) { if (tmp > ets[i]) { tmp = ets[i]; } } return tmp; }
double max_element() const { double tmp = ets[0]; for (size_t i=0; i<dim; ++i) { if (tmp < ets[i]) { tmp = ets[i]; } } return tmp; }
public: vector& operator+() { return *this; }
vector& operator-() { for (size_t i=0; i<dim; ++i) { ets[i] = -ets[i]; } return *this; }
public: vector& operator+=(const vector& v) { for (size_t i=0; i<dim; ++i) { ets[i] += v[i]; } return *this; }
vector& operator-=(const vector& v) { for (size_t i=0; i<dim; ++i) { ets[i] -= v[i]; } return *this; }
vector& operator*=(const vector& v) { for (size_t i=0; i<dim; ++i) { ets[i] *= v[i]; } return *this; }
vector& operator/=(const vector& v) { for (size_t i=0; i<dim; ++i) { ets[i] /= v[i]; } return *this; }
vector& operator+=(const double& d) { for (size_t i=0; i<dim; ++i) { ets[i] += d; } return *this; }
vector& operator-=(const double& d) { for (size_t i=0; i<dim; ++i) { ets[i] -= d; } return *this; }
vector& operator*=(const double& d) { for (size_t i=0; i<dim; ++i) { ets[i] *= d; } return *this; }
vector& operator/=(const double& d) { double tmp = 1/d; for (size_t i=0; i<dim; ++i) { ets[i] *= tmp; } return *this; }
public: template <class A, class B, class Op> vector& operator=(const tpl_expr<A, B, Op>& expr) { for (size_t i=0; i<dim; ++i) { ets[i] = expr[i]; } return *this; }
template <class A, class B, class Op> vector& operator+=(const tpl_expr<A, B, Op>& expr) { for (size_t i=0; i<dim; ++i) { ets[i] += expr[i]; } return *this; }
template <class A, class B, class Op> vector& operator-=(const tpl_expr<A, B, Op>& expr) { for (size_t i=0; i<dim; ++i) { ets[i] -= expr[i]; } return *this; }
template <class A, class B, class Op> vector& operator*=(const tpl_expr<A, B, Op>& expr) { for (size_t i=0; i<dim; ++i) { ets[i] *= expr[i]; } return *this; }
template <class A, class B, class Op> vector& operator/=(const tpl_expr<A, B, Op>& expr) { for (size_t i=0; i<dim; ++i) { ets[i] /= expr[i]; } return *this; } };
};
#endif // _NUMERIC_H_
// test.cpp
#include <ctime> #include <iostream> #include <valarray> using namespace std;
#include "numeric.h" using namespace numeric;
void main() { int m = 10000, n=10000; // vector x(m, 1), y(m, 2), z(m, 3); valarray<double> x(1, m), y(2, m), z(3, m);
clock_t time;
time = clock(); for (size_t i=0; i<n; ++i) { z = 0.5-(x - y)*1.0; }
time = clock() - time;
cout << z[0] << endl; cout << time/1000.0 << endl; } 
|