Advertisement
Guest User

myvector

a guest
May 4th, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <vector>
  4. #include <memory>
  5. #include <algorithm>
  6.  
  7.  
  8. template<typename T>
  9. class Vec
  10. {
  11. public:
  12.     int size;
  13.     int capacity;
  14.     T* data;
  15.     void pop();
  16.     void push_back(const T& a);
  17.     void print();
  18.     Vec()
  19.     {
  20.         size = 0;
  21.         capacity = 0;
  22.         data = nullptr;
  23.     }
  24.  
  25.     /*
  26.     V: Лучше так
  27.     Vec(): size(0), capacity(0), data(nullptr)
  28.     {
  29.     }
  30.     */
  31.  
  32.     /* V:
  33.      Лучше использовать какой-то однобайтовый тип вместо T*:
  34.      char* data, а память выделить с помощью new
  35.      Если память выделить не удаются, то malloc тихонько вернёт 0, а new бросит исключение, и вы о проблеме узнаете
  36.     */
  37.     Vec(int _size, T t) :size(_size),capacity(_size),data(malloc size*sizeof(t))
  38.     {
  39.     }
  40.  
  41.     ~Vec()
  42.     {
  43.         free( data);
  44.     }
  45.  
  46. };
  47.  
  48. template<typename T>
  49. void Vec<T>::push_back(const T& a)
  50. {
  51.     if (size < capacity)
  52.     {
  53.         try {
  54.             new (data + size) T(a);
  55.             size++;
  56.         }
  57.         catch (...)
  58.         {
  59.             std::cout << "!!!";
  60.             throw;
  61.         }
  62.     }
  63.     try {
  64.         capacity = capacity * 2;
  65.         /* V: проблем несколько
  66.           1) вы теряете данные, т.к. перетираете указатель на старые
  67.           2) вы требуете, чтобы в векторе хранились элементы, у которых есть конструктор T()
  68.           3) течёт память: вы что-то выделяете, но не освобождаете
  69.         */
  70.         data = new T[capacity];
  71.     }
  72.     catch (...)
  73.     {
  74.         std::cout << "!!!";
  75.         throw;
  76.     }
  77. };
  78.  
  79. template<typename T>
  80. void Vec<T>::pop()
  81. {
  82.     if (size > 0)
  83.       /*
  84.        V: явно не то, что надо
  85.       */
  86.         data[size--];
  87.     if (capacity > 2 * size)
  88.     {
  89.         try
  90.         {
  91.             capacity /= 2;
  92.            /*
  93.               V: те же проблемы, что и в добавлении элемента и увеличении capacity
  94.             */
  95.             T* data1;
  96.             data1 = data;
  97.             data = new T[capacity];
  98.             data = data1;
  99.         }
  100.         catch (...)
  101.         {
  102.             std::cout << "!!!";
  103.             throw;
  104.         }
  105.     }
  106. }
  107.  
  108. template<typename T>
  109. void Vec<T>::print()
  110. {
  111.     for (int i = 0; i < size; ++i)
  112.         std::cout << data[i] << endl;
  113. }
  114. int main()
  115. {
  116.     std::vector<int> t;
  117.     Vec<int> vector;
  118.     int k=0;
  119.     /*
  120.      V: когда вы тестируете функциональность, вы должны проверить работоспособность всех участков кода.
  121.      У вас пока большая часть кода просто не вызывалась.
  122.     */
  123.     for (int i = 0; i < 10; ++i)
  124.     {
  125.         std::cin >> k;
  126.         vector.push_back(k);
  127.     }
  128.     vector.pop();
  129.  
  130.     return 0;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement