tntvec.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:6k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. // Template Numerical Toolkit (TNT) for Linear Algebra
  2. //
  3. // BETA VERSION INCOMPLETE AND SUBJECT TO CHANGE
  4. // Please see http://math.nist.gov/tnt for updates
  5. //
  6. // R. Pozo
  7. // Mathematical and Computational Sciences Division
  8. // National Institute of Standards and Technology
  9. #ifndef TVECTOR_H
  10. #define TVECTOR_H
  11. #include <stdlib.h>
  12. #include <iostream.h>
  13. #include <strstream.h>
  14. #include <assert.h>
  15. #include "subscrpt.h"
  16. #ifdef TNT_USE_REGIONS
  17. #include "region1d.h"
  18. #endif
  19. //  see "tntreq.h" for TNT requirements for underlying vector
  20. //  class.  This need NOT be the STL vector<> class, but a subset
  21. //  that provides minimal services.
  22. //
  23. //  This is a container adaptor that provides the following services.
  24. //
  25. //      o)  adds 1-offset operator() access ([] is always 0 offset)
  26. //      o)  adds TNT_BOUNDS_CHECK to () and []
  27. //      o)  adds initialization from strings, e.g.  "1.0 2.0 3.0";
  28. //      o)  adds newsize(N) function (does not preserve previous values)
  29. //      o)  adds dim() and dim(1)
  30. //      o)  adds free() function to release memory used by vector
  31. //      o)  adds regions, e.g. A(Index(1,10)) = ... 
  32. //      o) 
  33. template <class BBVec>
  34. class TNT_Vector
  35. {
  36.   public:
  37.     typedef   BBVec::value_type T;
  38.     typedef         T   value_type;
  39.     typedef         T   element_type;
  40.     typedef         T*  pointer;
  41.     typedef         T*  iterator;
  42.     typedef         T&  reference;
  43.     typedef const   T*  const_iterator;
  44.     typedef const   T&  const_reference;
  45.     
  46.     Subscript lbound() const { return 1; }
  47.   protected:
  48.     BBVec v_;
  49.     T* vm1_;
  50.   public:
  51.     Subscript size() const { return v_.size(); }
  52.     iterator begin() { return v_.begin();}
  53.     iterator end()   { return v_.end(); }
  54.     const_iterator begin() const { return v_.begin();}
  55.     const_iterator end()  const { return v_.end(); }
  56.     Subscript dim() const { return v_.size(); }
  57.     Subscript dim(Subscript i)
  58.     {
  59. #ifdef TNT_BOUNDS_CHECK
  60.         assert(i==TNT_BASE_OFFSET);
  61. #endif
  62.         return (i==TNT_BASE_OFFSET ? v_.size() : 0 );
  63.     }
  64.     TNT_Vector() : v_() {};
  65.     TNT_Vector(const TNT_Vector<BBVec> &A) : v_(A.v_) 
  66.     { 
  67.         vm1_ = v_.begin() -1; 
  68.     } 
  69.     TNT_Vector(Subscript N, /*const*/ char *s) : v_(N) 
  70.     {
  71.         istrstream ins(s);
  72.         for (Subscript i=0; i<N; i++)
  73.             ins >> v_[i] ;
  74.         vm1_ = v_.begin() -1 ;
  75.     }; 
  76.     TNT_Vector(Subscript N, const T& value = T()) : v_(N, value)
  77.     {
  78.         vm1_ = v_.begin() -1;
  79.     }
  80.     TNT_Vector(Subscript N, const T* values) : v_(N)
  81.     {
  82.         for (Subscript i=0; i<N; i++)
  83.              v_[i]  = values[i];
  84.         vm1_ = v_.begin() -1;
  85.     } 
  86.     TNT_Vector(const BBVec & A) : v_(A) 
  87.     {
  88.         vm1_ = v_.begin() -1;
  89.     }
  90.     // NOTE: this assumes that BBVec(0) constructor creates an 
  91.     //  null vector that does not take up space...  It would be
  92.     //  great to require that BBVec have a corresponding free()
  93.     //  function, but in particular STL vectors do not.
  94.     //
  95.     TNT_Vector<BBVec>& free()
  96.     {
  97.         return *this = TNT_Vector<BBVec>(0);
  98.     }
  99.     TNT_Vector<BBVec>& operator=(const TNT_Vector<BBVec> &A) 
  100.     { 
  101.         v_ = A.v_ ; 
  102.         vm1_ = v_.begin() - 1;
  103.         return *this;
  104.     }
  105.     TNT_Vector<BBVec>& newsize(Subscript N)
  106.     {
  107.         // NOTE: this is not as efficient as it could be
  108.         // but to retain compatiblity with STL interface
  109.         // we cannot assume underlying implementation
  110.         // has a newsize() function.
  111.         return *this = TNT_Vector<BBVec>(N);
  112.     }
  113.     TNT_Vector<BBVec>& operator=(const T &a) 
  114.     {
  115.         Subscript i;
  116.         Subscript N = v_.size();    
  117.         for (i=0; i<N; i++)
  118.             v_[i] = a;
  119.         return *this;
  120.     }
  121.     TNT_Vector<BBVec>& resize(Subscript N) 
  122.     { 
  123.         if (N == size()) return *this;
  124.         TNT_Vector<BBVec> tmp(N);
  125.         Subscript n =  (N < size() ? N : size());  // min(N, size());
  126.         Subscript i;
  127.         for (i=0; i<n; i++)
  128.             tmp[i] = v_[i];
  129.             
  130.         return (*this = tmp);
  131.     }
  132.     reference operator()(Subscript i)
  133.     { 
  134. #ifdef TNT_BOUNDS_CHECK
  135.         assert(1<=i);
  136.         assert(i<=dim());
  137. #endif
  138.         return vm1_[i]; 
  139.     }
  140.     const_reference operator()(Subscript i) const
  141.     { 
  142. #ifdef TNT_BOUNDS_CHECK
  143.         assert(1<=i);
  144.         assert(i<=dim());
  145. #endif
  146.         return vm1_[i]; 
  147.     }
  148.     reference operator[](Subscript i)
  149.     { 
  150. #ifdef TNT_BOUNDS_CHECK
  151.         assert(0<=i);
  152.         assert(i<dim());
  153. #endif
  154.         return v_[i]; 
  155.     }
  156.     const_reference operator[](Subscript i) const
  157.     { 
  158. #ifdef TNT_BOUNDS_CHECK
  159.         assert(0<=i);
  160.         assert(i<dim());
  161. #endif
  162.         return v_[i]; 
  163.     }
  164. #ifdef TNT_USE_REGIONS
  165.     // "index-aware" features, all of these are 1-based offsets
  166.     typedef Region1D<TNT_Vector<BBVec> > Region;
  167.     typedef const_Region1D<TNT_Vector<BBVec>,T> const_Region;
  168.     Region operator()(const Index1D &I)
  169.     {   return Region(*this, I); }
  170.     Region operator()(const Subscript i1, Subscript i2)
  171.     {   return Region(*this, i1, i2); }
  172.     const_Region operator()(const Index1D &I) const
  173.     {   return const_Region(*this, I); }
  174.     const_Region operator()(const Subscript i1, Subscript i2) const
  175.     {   return const_Region(*this, i1, i2); }
  176. #endif
  177. // TNT_USE_REGIONS
  178. };
  179. #include <iostream.h>
  180. template <class BBVec>
  181. ostream& operator<<(ostream &s, const TNT_Vector<BBVec> &A)
  182. {
  183.     Subscript M=A.size();
  184.     s << M << endl;
  185.     for (Subscript i=1; i<=M; i++)
  186.             s << A(i) << endl;
  187.     return s;
  188. }
  189. template <class BBVec>
  190. istream& operator>>(istream &s, const TNT_Vector<BBVec> &A)
  191. {
  192.     Subscript N;
  193.     
  194.     s >> N;
  195.     TNT_Vector<BBVec,T> tmp(N);
  196.     for (Subscript i=1; i<=N; i++)
  197.         s >> tmp(i);
  198.     return s;
  199. }
  200. #endif