vector.hpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #ifndef VECTOR_HPP
  2. #define VECTOR_HPP
  3. #include <iostream>
  4. #include "debug.hpp"
  5. using namespace std;
  6. using Real = double;//float;
  7. #ifdef DEBUG
  8. struct Vector{
  9. size_t n;
  10. Real* data;
  11. Real& operator[](size_t i);
  12. };
  13. inline Real&
  14. Vector::operator[](size_t i){
  15. assert(i<n);
  16. return data[i];
  17. }
  18. inline Vector
  19. init_vector(size_t n){
  20. Vector v;
  21. v.n=n;
  22. v.data=new Real[n];
  23. return v;
  24. }
  25. inline void
  26. delete_vector(Vector v){
  27. delete[] v.data;
  28. }
  29. inline bool
  30. is_null(Vector v){
  31. return v.n==0;
  32. }
  33. static const Vector NullVector={0,nullptr};
  34. #else
  35. using Vector=Real*;
  36. inline Vector
  37. init_vector(size_t n){
  38. return new Real[n];
  39. }
  40. inline void
  41. delete_vector(Vector v){
  42. delete[] v;
  43. }
  44. #endif
  45. inline void
  46. display(Vector v,size_t n){
  47. if(n==0){
  48. cout<<"[]"<<endl;
  49. return;
  50. }
  51. cout<<'['<<v[0];
  52. for(size_t i=1;i<n;++i){
  53. cout<<','<<v[i];
  54. }
  55. cout<<']'<<endl;
  56. }
  57. inline size_t
  58. argmax(Vector v,size_t n){
  59. assert(n>0);
  60. size_t imax=0;
  61. Real vmax=v[0];
  62. for(size_t i=1;i<n;++i){
  63. if(v[i]>vmax){
  64. vmax=v[i];
  65. imax=i;
  66. }
  67. }
  68. return imax;
  69. }
  70. inline size_t
  71. indice2(size_t i,size_t j,size_t nj){
  72. return i*nj+j;
  73. }
  74. inline size_t
  75. indice3(size_t i,size_t j,size_t k,size_t nj,size_t nk){
  76. return (i*nj+j)*nk+k;
  77. }
  78. inline size_t
  79. indice4(size_t i,size_t j,size_t k,size_t l,size_t nj,size_t nk,size_t nl){
  80. return ((i*nj+j)*nk+k)*nl+l;
  81. }
  82. #endif