Рекомендации по написанию собственного STL-контейнера
При разработке нового контейнера, который соответствует соглашениям STL, крайне важно следовать определенным рекомендациям. чтобы обеспечить его правильное поведение и интеграцию с библиотекой STL.
Итератор Интерфейс:
- Определите класс итератора с соответствующим тегом iterator_category, например input_iterator_tag, output_iterator_tag, front_iterator_tag, двунаправленный_iterator_tag или random_access_iterator_tag.
- Предоставьте функции-члены для сравнения (= =, !=), увеличение/уменьшение ( , --), арифметические операции ( , -) и разыменования (*, ->).
Const Iterator:
- Предоставьте класс const_iterator, вложенный в класс итератора, позволяющий перебирать константные контейнеры.
- Определите те же функции-члены, что и неконстантные итератор, но с константными ссылками и указателями.
Сравнение и присваивание:
- Реализуйте операторы сравнения (==, !=, , =) для самого контейнера.
- Предоставьте оператор присваивания, который принимает ссылку на другой контейнер. контейнер.
Емкость и доступ:
- Включите функции-члены, такие как пустой(), size(), max_size() для управления размером контейнера и емкость.
- Укажите начало(), конец(), cbegin(), cend(), rbegin(), rend(), crbegin() и crend() для доступ к итераторам, представляющим элементы контейнера.
- Определите такие функции, как front(), back(), at() и оператор[] для доступа к элементам или их изменения.
Вставки и удаления:
- Реализуйте emplace_front(), emplace_back(), push_front(), push_back(), pop_front() и pop_back() для вставки и удаления элементов.
- Предоставьте функции-члены emplace(), Insert() и Erase() для вставки и удаления элементов внутри контейнера.
Разное:
- Включите функцию-член swap() для обмена содержимым двух контейнеры одного типа.
- Реализуйте get_allocator() для получения распределителя, связанного с контейнером.
- Определите отдельную функцию swap() для замены контейнеров одного типа.
Тестирование:
Чтобы обеспечить надежность вашего контейнера, используйте класс тестирования, например предоставил класс тестера, чтобы убедиться, что:
- Срок жизни объекта управляется должным образом.
- Вызовы функций не изменяют неожиданно состояние объекта.
- Контейнер работает правильно при создании с глобальными объектами и без них.