Задание №5
В данном задании необходимо написать два вида умных указателей, класс persistent_set,
и на основе persistent_set сравнить эффективность этих двух видов умных указателей.
Вам необходимо написать класс persistent_set, аналогичный
этому заданию для пересдачи со следующими дополнительными
требованиями:
- Поскольку мы уже знаем что такое шаблоны, value_type
должен быть не какой-то заранее известный тип, а приходить из параметра шаблона
persistent_set'а.
- persistent_set<T> не должен требовать, чтобы
T был DefaultConstructible.
- Поскольку мы знаем, что такое rvalue-references, persistent_set должен их
поддерживать: предоставлять перегрузки от rvalue-ссылок там где это уместно, енаблить мув
там, где это возможно.
- Поскольку мы знаем, что такое noexcept, функции persistent_set'а должны быть
соответствующим образом аннотированы.
- Пожалуйста, не забудьте написать swap для всех типов, для которых он имеет смысл.
При реализации этого класса вам понадобится использовать умные указатели. В этом
задании вам предлагается реализовать два вида умных указателей и сравнить
производительность класса persistent_set с использованием каждого из них.
- Первый вид умных указателей это умные указатели на основе счетчиков ссылок. Скорее
всего вам не понадобится вся мощь предоставляемая shared_ptr (вам не понадобятся weak
ссылки, custom deleter'ы, возможность аттачиться к уже аллоцированному сырому указателю
и т.п.), поэтому вы можете сделать свой указатель более простым и эффективным, чем
стандартный shared_ptr.
- Второй вид указателей, назовем его linked_ptr, мы не разбирали на лекции, он основан
на следующей идее. Давайте провяжем все указатели ссылающиеся на данный объект в
двусвязный список. Когда указатель перестает ссылаться на объект он удаляется из
этого списка. Когда список становится пустым объект можно удалить. Бонусом такого
умного указателя является то, что он может аттачиться к сырому указателю без аллокации
памяти.