You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ABACUS_Vect.h 8.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. /**********************************************************
  2. This software is part of J.-S. Caux's ABACUS++ library.
  3. Copyright (c) J.-S. Caux.
  4. -----------------------------------------------------------
  5. File: ABACUS_Vect.h
  6. Purpose: Declares vector class.
  7. ***********************************************************/
  8. #ifndef ABACUS_VECT_H
  9. #define ABACUS_VECT_H
  10. namespace ABACUS {
  11. template <class T>
  12. class Vect {
  13. private:
  14. int dim;
  15. T* V;
  16. public:
  17. Vect();
  18. explicit Vect (int N);
  19. Vect (const T& a, int N); // initialize all N elements are a
  20. Vect (const T* a, int N); // initialize to array
  21. Vect (const Vect& rhs); // Copy constructor
  22. Vect& operator= (const Vect& rhs); // assignment
  23. Vect& operator= (const T& a); // assign a to all elements
  24. inline T& operator[] (const int i);
  25. inline const T& operator[] (const int i) const;
  26. Vect& operator+= (const Vect& rhs);
  27. Vect& operator-= (const Vect& rhs);
  28. bool operator== (const Vect& rhs); // checks equality of size and of all elements
  29. bool operator!= (const Vect& rhs); // checks inequality
  30. bool Append (const T& rhs); // appends rhs to the vector
  31. bool Append (const Vect& rhs); // appends rhs to the vector
  32. bool Increase_Size (int nr_to_add); // resizes the array to accommodate nr_to_add more entries
  33. bool Increase_Size (int nr_to_add, T setval); // resizes the array to accommodate nr_to_add more entries
  34. inline int size() const;
  35. inline double norm() const; // returns norm of vector
  36. inline T max() const; // returns maximal value
  37. inline T min() const; // returns maximal value
  38. inline T sum() const; // returns sum of all elements
  39. inline bool includes(T check) const; // whether check == one of the elements or not
  40. void QuickSort (int l, int r);
  41. void QuickSort (Vect<int>& index, int l, int r);
  42. void QuickSort ();
  43. void QuickSort (Vect<int>& index);
  44. ~Vect();
  45. };
  46. template <class T>
  47. Vect<T>::Vect() : dim(0), V(0) {}
  48. template <class T>
  49. Vect<T>::Vect (int N) : dim(N), V(new T[N]) {}
  50. template <class T>
  51. Vect<T>::Vect (const T& a, int N) : dim(N), V(new T[N])
  52. {
  53. for (int i = 0; i < N; ++i) V[i] = a;
  54. }
  55. template <class T>
  56. Vect<T>::Vect (const T* a, int N) : dim(N), V(new T[N])
  57. {
  58. for (int i = 0; i < N; ++i) V[i] = *a++;
  59. }
  60. template <class T>
  61. Vect<T>::Vect (const Vect<T>& rhs) : dim(rhs.dim), V(new T[dim])
  62. {
  63. for (int i = 0; i < dim; ++i) V[i] = rhs[i];
  64. }
  65. template <class T>
  66. Vect<T>& Vect<T>::operator= (const Vect<T>& rhs)
  67. {
  68. if (this != &rhs) {
  69. if (dim != rhs.dim) {
  70. if (V != 0) delete[] V;
  71. dim = rhs.dim;
  72. V = new T[dim];
  73. }
  74. for (int i = 0; i < dim; ++i) V[i] = rhs[i];
  75. }
  76. return *this;
  77. }
  78. template <class T>
  79. Vect<T>& Vect<T>::operator= (const T& a)
  80. {
  81. for (int i = 0; i < dim; ++i) V[i] = a;
  82. return *this;
  83. }
  84. template <class T>
  85. inline T& Vect<T>::operator[] (const int i)
  86. {
  87. return V[i];
  88. }
  89. template <class T>
  90. inline const T& Vect<T>::operator[] (const int i) const
  91. {
  92. return V[i];
  93. }
  94. template <class T>
  95. Vect<T>& Vect<T>::operator+= (const Vect<T>& rhs)
  96. {
  97. for (int i = 0; i < dim; ++i) V[i] += rhs[i];
  98. return *this;
  99. }
  100. template <class T>
  101. Vect<T>& Vect<T>::operator-= (const Vect<T>& rhs)
  102. {
  103. for (int i = 0; i < dim; ++i) V[i] -= rhs[i];
  104. return *this;
  105. }
  106. template <class T>
  107. bool Vect<T>::operator== (const Vect<T>& rhs)
  108. {
  109. bool answer = ((*this).size() == rhs.size());
  110. if (answer) {
  111. for (int i = 0; i < dim; ++i) answer = (answer && (V[i] == rhs[i]));
  112. }
  113. return answer;
  114. }
  115. template <class T>
  116. bool Vect<T>::operator!= (const Vect<T>& rhs)
  117. {
  118. return(!((*this) == rhs));
  119. }
  120. template <class T>
  121. bool Vect<T>::Append (const Vect<T>& rhs) // appends rhs to the vector
  122. {
  123. T* newvect = new T[dim + rhs.size()];
  124. for (int i = 0; i < dim; ++i) newvect[i] = V[i];
  125. for (int i = 0; i < rhs.size(); ++i) newvect[i+ dim] = rhs[i];
  126. dim += rhs.size();
  127. delete[] V;
  128. V = new T[dim];
  129. for (int i = 0; i < dim; ++i) V[i] = newvect[i];
  130. delete[] newvect;
  131. return(true);
  132. }
  133. template <class T>
  134. bool Vect<T>::Append (const T& rhs) // appends rhs to the vector
  135. {
  136. T* newvect = new T[dim + 1];
  137. for (int i = 0; i < dim; ++i) newvect[i] = V[i];
  138. newvect[dim] = rhs;
  139. dim += 1;
  140. delete[] V;
  141. V = new T[dim];
  142. for (int i = 0; i < dim; ++i) V[i] = newvect[i];
  143. delete[] newvect;
  144. return(true);
  145. }
  146. template <class T>
  147. bool Vect<T>::Increase_Size (int nr_to_add) // resizes the array to accommodate nr_to_add more entries
  148. {
  149. int resized_dim = dim + nr_to_add;
  150. T* resized_vect = new T[resized_dim];
  151. for (int i = 0; i < dim; ++i) resized_vect[i] = V[i];
  152. for (int i = dim; i < resized_dim; ++i) resized_vect[i] = T(0);
  153. dim = resized_dim;
  154. delete[] V;
  155. V = new T[dim];
  156. for (int i = 0; i < dim; ++i) V[i] = resized_vect[i];
  157. delete[] resized_vect;
  158. return(true);
  159. }
  160. template <class T>
  161. bool Vect<T>::Increase_Size (int nr_to_add, T setval) // resizes the array to accommodate nr_to_add more entries
  162. {
  163. int resized_dim = dim + nr_to_add;
  164. T* resized_vect = new T[resized_dim];
  165. for (int i = 0; i < dim; ++i) resized_vect[i] = V[i];
  166. for (int i = dim; i < resized_dim; ++i) resized_vect[i] = setval;
  167. dim = resized_dim;
  168. delete[] V;
  169. V = new T[dim];
  170. for (int i = 0; i < dim; ++i) V[i] = resized_vect[i];
  171. delete[] resized_vect;
  172. return(true);
  173. }
  174. template <class T>
  175. inline int Vect<T>::size() const
  176. {
  177. return dim;
  178. }
  179. template <class T>
  180. inline double Vect<T>::norm () const
  181. {
  182. double normsq = 0.0;
  183. for (int i = 0; i < dim; ++i) normsq += abs(V[i]) * abs(V[i]);
  184. return sqrt(normsq);
  185. }
  186. template <>
  187. inline double Vect<double>::norm () const
  188. {
  189. double normsq = 0.0;
  190. for (int i = 0; i < dim; ++i) normsq += V[i] * V[i];
  191. return(sqrt(normsq));
  192. }
  193. template <>
  194. inline double Vect<std::complex<double> >::norm () const
  195. {
  196. double normsq = 0.0;
  197. for (int i = 0; i < dim; ++i) normsq += std::norm(V[i]);
  198. return(sqrt(normsq));
  199. }
  200. template <class T>
  201. inline T Vect<T>::max() const
  202. {
  203. T maxval = V[0];
  204. for (int i = 0; i < dim; ++i) if (V[i] > maxval) maxval = V[i];
  205. return maxval;
  206. }
  207. template <class T>
  208. inline T Vect<T>::min() const
  209. {
  210. T minval = V[0];
  211. for (int i = 0; i < dim; ++i) if (V[i] < minval) minval = V[i];
  212. return minval;
  213. }
  214. template <class T>
  215. inline T Vect<T>::sum() const
  216. {
  217. T total = T(0);
  218. for (int i = 0; i < dim; ++i) total += V[i];
  219. return total;
  220. }
  221. template <class T>
  222. inline bool Vect<T>::includes (T check) const
  223. {
  224. int index = 0;
  225. while (index < dim && V[index] != check) index++;
  226. return(index < dim);
  227. }
  228. template <class T>
  229. void Vect<T>::QuickSort (int l, int r)
  230. {
  231. int i = l, j = r;
  232. T pivot = V[l + (r-l)/2];
  233. while (i <= j) {
  234. while (V[i] < pivot) i++;
  235. while (V[j] > pivot) j--;
  236. if (i <= j) {
  237. std::swap(V[i],V[j]);
  238. i++;
  239. j--;
  240. }
  241. };
  242. if (l < j) (*this).QuickSort(l, j);
  243. if (i < r) (*this).QuickSort(i, r);
  244. }
  245. template <class T>
  246. void Vect<T>::QuickSort ()
  247. {
  248. if ((*this).size() > 1) (*this).QuickSort (0, (*this).size() - 1);
  249. }
  250. template <class T>
  251. void Vect<T>::QuickSort (Vect<int>& index, int l, int r)
  252. {
  253. int i = l, j = r;
  254. T pivot = V[l + (r-l)/2];
  255. while (i <= j) {
  256. while (V[i] < pivot) i++;
  257. while (V[j] > pivot) j--;
  258. if (i <= j) {
  259. std::swap(V[i],V[j]);
  260. std::swap(index[i],index[j]);
  261. i++;
  262. j--;
  263. }
  264. };
  265. if (l < j) (*this).QuickSort(index, l, j);
  266. if (i < r) (*this).QuickSort(index, i, r);
  267. }
  268. template <class T>
  269. void Vect<T>::QuickSort (Vect<int>& index)
  270. {
  271. if (index.size() != (*this).size()) ABACUSerror("Wrong dim for index in Vect QuickSort.");
  272. (*this).QuickSort (index, 0, (*this).size() - 1);
  273. }
  274. template <class T>
  275. inline std::ostream& operator<< (std::ostream& s, const Vect<T>& vector)
  276. {
  277. for (int i = 0; i < vector.size() - 1; ++i) s << vector[i] << " ";
  278. if (vector.size() >= 1) s << vector[vector.size() - 1];
  279. return (s);
  280. }
  281. template <class T>
  282. Vect<T>::~Vect<T>()
  283. {
  284. if (V != 0) delete[] V;
  285. }
  286. // TYPEDEFS
  287. typedef ABACUS::Vect<int> Vect_INT;
  288. typedef ABACUS::Vect<double> Vect_DP;
  289. typedef ABACUS::Vect<std::complex<double> > Vect_CX;
  290. } // namespace ABACUS
  291. #endif