Реализация библиотек my_containers.h и my_containersplus.h.
В данном проекте библиотека my_containers.h реализует основные стандартные контейнерные классы языка С++: list
(список), map
(словарь), queue
(очередь), set
(множество), stack
(стек) и vector
(вектор). Библиотека my_containersplus.h реализует контейнерные классы языка С++:array
(массив), multiset
(мультимножество).
Реализации предоставляют набор стандартных методов и атрибутов для работы с элементами, проверкой заполненности контейнера и итерирования.
Каждый вид контейнеров предоставляет пользователю следующие методы:
-
стандартные конструкторы (конструктор по умолчанию, конструктор копирования, конструктор перемещения, конструктор со списком инициализации);
-
методы доступа к элементам контейнера (например, осуществление доступа к элементу с индексом i);
-
методы проверки наполненности контейнера (например, количество элементов в контейнере, проверка на пустоту контейнера);
-
методы изменения контейнера (удаление и добавление новых элементов, очистка контейнера);
-
методы для работы с итератором контейнера.
Итераторы обеспечивают доступ к элементам контейнера. Для каждого контейнера конкретный тип итератора будет отличаться. Это связано с различным видом организации наборов объектов в контейнерных классах, а также с фактической реализацией контейнера. Итераторы реализуются в таком виде, чтобы они работали схожим образом с указателем на элемент массива языка С. Именно такой подход через использование итераторов и позволяет взаимодействовать с любыми контейнерами одинаковым образом. Через методы begin()
и end()
контейнеры предоставляют итераторы, которые указывают на первый и следующий после последнего элементы контейнера соответственно.
Над итератором iter
определены следующие операции:
-
*iter
: получение элемента, на который указывает итератор; -
++iter
: перемещение итератора вперед для обращения к следующему элементу; -
--iter
: перемещение итератора назад для обращения к предыдущему элементу; -
iter1 == iter2
: два итератора равны, если они указывают на один и тот же элемент; -
iter1 != iter2
: два итератора не равны, если они указывают на разные элементы.
Контейнеры реализованы на основе шаблонных классов.
Контейнеры подразделяются на два основных типа: последовательные и ассоциативные. Для нахождения элемента в последовательных контейнерах (list
, vector
, array
, stack
, queue
) необходимо последовательно просмотреть весь контейнер, в то время как в ассоциативных (map
, set
, multiset
) достаточно обратиться по ассоциированному с значением ключу.
Библиотека my_containers.h:
List
Map
Queue
Set
Stack
Vector
Библиотека my_containersplus.h:
Array
Multiset
- Программа разработана на языке C++ стандарта C++17 с использованием компилятора g++;
- Код соответствует Google Style;
- Используются итераторы;
- Классы шаблонные;
- Классы реализованы внутри пространства имен
mycontainers
; - Подготовлено покрытие unit-тестами методов контейнерных классов c помощью библиотеки GTest;
- Соблюдена логика работы стандартной библиотеки шаблонов (STL) (в части проверок, работы с памятью и поведения в нештатных ситуациях).
- Решение оформлено в виде заголовочных файлов
my_containers.h
иmy_containersplus.h
, которые включают в себя другие заголовочные файлы с реализациями необходимых контейнеров (my_list.h
,my_map.h
и т.д.); - Предусмотрен Makefile для тестов написанных библиотек (с целями all, clean, test, gcov_report);