В лекциях мы уже начали реализовывать свой вектор. В этой задаче вам надо его развить: добавить методы Size, Capacity и PushBack. Пришлите на проверку заголовочный файл simple_vector.h, содержащий объявление и определение шаблона класса SimpleVector:
template <typename T>
class SimpleVector {
public:
SimpleVector() = default;
explicit SimpleVector(size_t size);
~SimpleVector();
T& operator[](size_t index);
T* begin();
T* end();
size_t Size() const;
size_t Capacity() const;
void PushBack(const T& value);
private:
...
};
- метод Capacity должен возвращать текущую ёмкость вектора — количество элементов, которое помещается в блок памяти, выделенный вектором в данный момент
- метод Size должен возвращать количество элементов в векторе
- метод PushBack добавляет новый элемент в конец вектора; если в текущем выделенном блоке памяти не осталось свободного места (т.е. Size() == Capacity()), вектор должен выделить блок размера 2 * Capacity(), скопировать в него все элементы и удалить старый.
- первый вызов метода PushBack для вновь созданного объекта должен делать ёмкость, равной единице
- метод PushBack должен иметь амортизированную константную сложность
- методы begin и end должны возвращать итераторы текущие начало и конец вектора
- в деструкторе должен освобождаться текущий блок памяти, выделенный вектором
- также см. дополнительные требования к работе SimpleVector в юнит-тестах в приложенном шаблоне решения
Заголовочный файл, который вы пришлёте на проверку, не должен подключать файлы , , <forward_list>, , . Если у вас будет подключен один из этих файлов, вы получите ошибку компиляции.
Наверняка в вашей реализации шаблона класса SimpleVector будет поле, являющееся указателем. В конструкторе по умолчанию вам надо будет его чем-нибудь проинициализировать. В лекциях мы рассматривали только один способ инициализации указателей — с помощью оператора new. В C++ есть специальное значение, означающее указатель, который ни на что не указывает — nullptr:
int* p = nullptr;
string* q = nullptr;
map<string, vector<int>>\* r = nullptr;
Вы можете использовать nullptr для инициализации указателя в конструкторе по умолчанию.