Skip to content

Latest commit

 

History

History
54 lines (39 loc) · 3.61 KB

task.md

File metadata and controls

54 lines (39 loc) · 3.61 KB

Задание по программированию «Пишем свой вектор»

Условие

В лекциях мы уже начали реализовывать свой вектор. В этой задаче вам надо его развить: добавить методы 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 для инициализации указателя в конструкторе по умолчанию.