В статье N2913, озаглавленнойНазначение и инициализация SCARY-итератора, предлагается требование о том, что типы итераторов стандартного контейнера не зависят от какого-либо аргумента типа, кроме типа контейнера<value_type>,<difference_type>,<pointertype>и<const_pointer>. В частности, согласно предложению, типы итераторов стандартного контейнера не должны зависеть от типов контейнера<key_compare>,<hasher>,<key_equal>или<allocator>.
Этот документ продемонстрировал, что операции SCARY имеют решающее значение для эффективного внедрения общих шаблонов проектирования с использованием компонентов STL. Он показал, что реализации, поддерживающие операции SCARY, уменьшают раздувание объектного кода, устраняя избыточные специализации итераторов и шаблонов алгоритмов.
Навязчивыеконтейнеры немного отличаются от стандартных контейнеров. В частности, они не имеют параметра распределителя и могут быть сконфигурированы с дополнительными опциями, не присутствующими в STL-подобных контейнерах. Таким образом,Boost.Intrusiveпредлагает свою собственную<SCARYiterator>реализацию, где типы итераторов не изменяются, когда контейнер настроен с опцией, которая не изменяет преобразование значения<->узла. Более конкретно, следующие варианты и условия гарантируют, что типы итераторов не изменятся:
Все контейнеры:<size_type<>>,<constant_time_size<>>,
Все древовидные контейнеры<[multi]set>,<avl_[multi]set>,<sg_[multi]set>,<bs_[multi]set>,<splay_[multi]set>,<treap_[multi]set>:<compare<>>.
<treap_[multi]set>:<priority<>>
<bs_[multi]set>,<sg_[multi]set>,<treap_[multi]set>,<splay_[multi]set>: Они имеют один и тот же тип итератора при настройке с одинаковыми опциями.
Статья Scary Iterators раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 17. Boost.Intrusive может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.