Advertisement
Guest User

Untitled

a guest
Mar 21st, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.73 KB | None | 0 0
  1. //
  2. // vector.h
  3. // vector
  4. //
  5. // Created by Fatlum on 3/10/18.
  6. // Copyright © 2018 fatlum. All rights reserved.
  7. //
  8.  
  9. #include<iostream>
  10. #include<initializer_list>
  11.  
  12. using namespace std;
  13.  
  14. class Vector{
  15.  
  16. public:
  17. using value_type = double;
  18. using size_type = size_t;
  19. using difference_type = ptrdiff_t;
  20. using reference = value_type&;
  21. using const_reference = const value_type&;
  22. using pointer = value_type*;
  23. using const_pointer = const value_type*;
  24.  
  25. class Const_iterator{
  26.  
  27. public:
  28. using value_type= Vector::value_type;
  29. using difference_type = Vector::difference_type;
  30. using reference = Vector::reference;
  31. using pointer = Vector::pointer;
  32. using iterator_category = std::forward_iterator_tag;
  33.  
  34. private:
  35. pointer ptr;
  36. const Vector* v;
  37. public:
  38. Const_iterator();
  39.  
  40. Const_iterator(pointer ptr, const Vector* v){
  41. this-> ptr = ptr;
  42. this-> v = v;
  43. }
  44.  
  45. };
  46. class Iterator{
  47.  
  48. public:
  49. using value_type= Vector::value_type;
  50. using difference_type = Vector::difference_type;
  51. using reference = Vector::reference;
  52. using pointer = Vector::pointer;
  53. using iterator_category = std::forward_iterator_tag;
  54.  
  55. private:
  56. pointer ptr;
  57. const Vector* v;
  58.  
  59. public:
  60. /*
  61. operator Const_iterator const{
  62. return Const_iterator{ptr,c};
  63. }*/
  64. Iterator();
  65.  
  66. Iterator(pointer ptr, const Vector* v){
  67. this-> ptr = ptr;
  68. this-> v = v;
  69. }
  70.  
  71. Iterator& operator++(){//prefix
  72. ++ptr;
  73. return *this;
  74. }
  75.  
  76. Iterator operator++(int){//postfix
  77. Iterator old = *this;
  78. ++*this;
  79. return old;
  80. }
  81.  
  82. reference operator*() const{
  83. if ((ptr >= v->v + v->size()) || ptr < v->v)
  84. throw runtime_error("[Fehlermeldung] ");
  85. return *ptr;
  86. }
  87.  
  88. pointer operator->() const{
  89. //Validierung
  90. if(v->size() == 0)
  91. throw runtime_error("[Leer]");
  92. return ptr;
  93. }
  94.  
  95. friend difference_type operator!=(Iterator& lop, Iterator& rop){
  96. return lop.ptr != rop.ptr;
  97. }
  98.  
  99. friend difference_type operator==(Iterator& lop, Iterator& rop){
  100. return lop.ptr == rop.ptr;
  101. }
  102.  
  103. friend difference_type operator-(Iterator& lop, Iterator& rop){
  104. return lop.ptr - rop.ptr;
  105. }
  106.  
  107. };
  108.  
  109.  
  110. using const_iterator = Const_iterator;
  111. using iterator = Iterator;
  112.  
  113. private:
  114.  
  115. size_t max_sz;
  116. size_t sz;
  117. double *v;
  118.  
  119.  
  120. public:
  121.  
  122. Vector():Vector(0){}
  123.  
  124. Vector(size_t len){
  125. max_sz = len;
  126. v = len == 0 ? nullptr : new double[len];
  127. sz = 0;
  128. }
  129.  
  130. Vector(initializer_list<double> l): Vector(){
  131. for(const auto& e: l)
  132. push_back(e);
  133. }
  134.  
  135. Vector(const Vector& rop): Vector(){
  136. for(size_t i=0; i < rop.sz; i++)
  137. push_back(rop[i]);
  138. }
  139.  
  140. ~Vector(){
  141. delete[] v;
  142. }
  143.  
  144. Vector& operator=(const Vector& rop)
  145. {
  146. clear();
  147. for(size_t i=0; i < rop.sz; i++)
  148. push_back(rop[i]);
  149. return *this;
  150.  
  151. }
  152.  
  153. size_t size() const{
  154. return sz;
  155. }
  156.  
  157. bool empty() const{
  158. return !sz;
  159. }
  160.  
  161. void clear(){
  162. sz=0;
  163. }
  164.  
  165. void reserve(size_t new_len){
  166. double* buf = new double[new_len];
  167. for(size_t i=0; i < sz; i++)
  168. buf[i] = v[i];
  169. delete[] v;
  170. v = buf;
  171. max_sz = new_len;
  172. }
  173.  
  174. void shrink_to_fit(){
  175. if(sz == 0){
  176. delete[] v;
  177. max_sz = 0;
  178. sz=0;
  179. v = nullptr;
  180. return;
  181. }
  182. double *buf(new double[sz]);
  183. for(size_t i=0; i< sz;i++)
  184. buf[i] = v[i];
  185. delete[] v;
  186. v=buf;
  187. max_sz = sz;
  188. }
  189.  
  190. void push_back(double d) {
  191. if(sz==max_sz)
  192. reserve(max_sz*2+10);
  193. v[sz++] = d ;
  194. }
  195.  
  196. void pop_back(){
  197. if(empty())
  198. throw runtime_error("Vector leer!\n");
  199. sz--;
  200. }
  201.  
  202. double& operator[](size_t index){
  203. if(index<sz)
  204. return v[index];
  205. throw runtime_error(" [Fehlermeldung]");
  206. }
  207.  
  208. const double& operator[](size_t index) const{
  209. if(index<sz)
  210. return v[index];
  211. throw runtime_error(" [Fehlermeldung]");
  212.  
  213.  
  214. }
  215.  
  216. friend ostream& operator<<(ostream& o, const Vector& v){
  217. o << '[';
  218. bool first{true};
  219. for(size_t i{0}; i < v.sz ; i++){
  220. if(first)
  221. first=false;
  222. else
  223. o << ", ";
  224. o << v.v[i];
  225. }
  226. return o << ']';
  227. }
  228.  
  229. Iterator begin(){return Iterator{v,this};}
  230. Iterator end(){return Iterator{v+sz,this};}
  231.  
  232. /*
  233. const_iterator begin()const {return Const_iterator{v,this};}
  234. const_iterator end()const {return Const_iterator{v+sz,this};}
  235. */
  236.  
  237.  
  238.  
  239. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement