Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- #include <vector>
- #include <memory>
- #include <algorithm>
- template<typename T>
- class Vec
- {
- public:
- int size;
- int capacity;
- T* data;
- void pop();
- void push_back(const T& a);
- void print();
- Vec()
- {
- size = 0;
- capacity = 0;
- data = nullptr;
- }
- /*
- V: Лучше так
- Vec(): size(0), capacity(0), data(nullptr)
- {
- }
- */
- /* V:
- Лучше использовать какой-то однобайтовый тип вместо T*:
- char* data, а память выделить с помощью new
- Если память выделить не удаются, то malloc тихонько вернёт 0, а new бросит исключение, и вы о проблеме узнаете
- */
- Vec(int _size, T t) :size(_size),capacity(_size),data(malloc size*sizeof(t))
- {
- }
- ~Vec()
- {
- free( data);
- }
- };
- template<typename T>
- void Vec<T>::push_back(const T& a)
- {
- if (size < capacity)
- {
- try {
- new (data + size) T(a);
- size++;
- }
- catch (...)
- {
- std::cout << "!!!";
- throw;
- }
- }
- try {
- capacity = capacity * 2;
- /* V: проблем несколько
- 1) вы теряете данные, т.к. перетираете указатель на старые
- 2) вы требуете, чтобы в векторе хранились элементы, у которых есть конструктор T()
- 3) течёт память: вы что-то выделяете, но не освобождаете
- */
- data = new T[capacity];
- }
- catch (...)
- {
- std::cout << "!!!";
- throw;
- }
- };
- template<typename T>
- void Vec<T>::pop()
- {
- if (size > 0)
- /*
- V: явно не то, что надо
- */
- data[size--];
- if (capacity > 2 * size)
- {
- try
- {
- capacity /= 2;
- /*
- V: те же проблемы, что и в добавлении элемента и увеличении capacity
- */
- T* data1;
- data1 = data;
- data = new T[capacity];
- data = data1;
- }
- catch (...)
- {
- std::cout << "!!!";
- throw;
- }
- }
- }
- template<typename T>
- void Vec<T>::print()
- {
- for (int i = 0; i < size; ++i)
- std::cout << data[i] << endl;
- }
- int main()
- {
- std::vector<int> t;
- Vec<int> vector;
- int k=0;
- /*
- V: когда вы тестируете функциональность, вы должны проверить работоспособность всех участков кода.
- У вас пока большая часть кода просто не вызывалась.
- */
- for (int i = 0; i < 10; ++i)
- {
- std::cin >> k;
- vector.push_back(k);
- }
- vector.pop();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement