Список: LinkedList & ArrayList
<aside> ❗ Пользоваться коллекциями стандартной библиотеки нельзя.
</aside>
Ваша задача в этой практике - переписать List в С++, используя шаблонные классы ArrayList<T>
и LinkedList<T>
. К сожалению, при использовании шаблонов, мы не можем использовать виртуальные функции, поэтому у нас не будет базового интерфейса IList
.
Благодаря использованию шаблонов, мы сможем хранить в структуре данных List
объекты любых типов, а не только int
, как было ранее.
Но, раз мы стали использовать C++, то конечно же нам надо воспользоваться всеми его фичами:
ArrayList<int> arr = {1,2,3,4,5,6,7,8,9};
(См std::initializer_list<Q>)ArrayList
, который создает пустой массив, НО с заданной capacity. Повышает эффективность использования ArrayList: нам не нужно делать копирования даных, когда capacity исчерпает себя.[]
, вместо функции T Get(int index)
. Если промазали по индексу, то надо выбрасывать исключение.LinkedList<int> list = {1,2,3,4,5,6,7,8,9};
for (auto& element: list) {
cout << element << " ";
}
// Выведет
// 1 2 3 4 5 6 7 8 9
std::vector
. А у LinkedList вам еще придется создать класс итератор.:typedef<typename T>
class LinkedList {
public:
class iterator {
public:
typedef T value_type;
typedef std::forward_iterator_tag iterator_category;
typedef int difference_type;
// конструктор
iterator(T* ptr) : ptr_(ptr) { }
iterator operator++();
iterator operator++(int junk);
T& operator*();
T* operator->();
bool operator==(const iterator& rhs);
bool operator!=(const iterator& rhs);
};
};
LinkedList<int> list = {1,2,3,4,5,6,7,8,9};
for (auto el = list.begin(); el != list.end(); e++) {
cout << *el << " ";
}
// Выведет
// 1 2 3 4 5 6 7 8 9