<slist>— самый простой интрузивный контейнерBoost.Intrusive: Единый связанный список. Память, которую он накладывает, составляет 1 указатель на узел. Размер пустого, непостоянного времени<slist>равен размеру 1 указателя. Тем не менее, этот легкий объем памяти имеет недостатки: многие операции имеют линейную временную сложность, даже те, которые обычно являются постоянным временем, например<swap>.<slist>только передовые итераторы.
В большинстве случаев предпочтительнее двойной список, потому что он предлагает больше функций постоянного времени с немного большим размером накладных расходов. Тем не менее, для некоторых приложений, таких как создание более сложных контейнеров, списки по отдельности имеют важное значение из-за их небольших накладных расходов.
<tag<classTag>>(только для базовых крючков): Этот аргумент служит тегом, поэтому вы можете извлечь из более чем одного крючка списка. Дефолт:<tag<default_tag>>.
<void_pointer<classVoidPointer>>: Тип указателя, который должен использоваться внутри крючка и распространяться на контейнер. Дефолт:<void_pointer<void*>>.
<base_hook<classHook>>/<member_hook<classT,classHook,HookT::*PtrToMember>>/<value_traits<classValueTraits>>: Чтобы указать тип крючка или характеристики значения, используемые для настройки контейнера. (Чтобы узнать о ценностных чертах, перейдите в разделКонтейнеры с пользовательскими стоимостными чертами.)
<constant_time_size<boolEnabled>>: Для активации операции постоянного времени<size()>. Дефолт:<constant_time_size<true>>
<size_type<boolEnabled>>: Указать тип, который будет использоваться для хранения размера контейнера. Дефолт:<size_type<std::size_t>>.
<linear<boolEnable>>: Единый связанный список реализуется как нулевой список вместо кругового списка. Это позволяет<O(1)>обменять, но теряет некоторые операции, такие как<container_from_end_iterator>.
<cache_last<boolEnable>>:<slist>также содержит указатель на последний элемент единственно связанного списка. Это позволяет<O(1)>своп,<splice_after(iterator,slist&)>и делает список предложений новых функций, как<push_back(reference)>и<back()>. По логике, размер пустого списка увеличивается в<sizeof(void_pointer)>, и кэшированный указатель последнего узла должен обновляться в каждой операции, и это может повлечь за собой небольшое влияние на производительность.
<auto_unlink>Крючки не используются, если используются<linear<true>>и/или<cache_last<true>>опции. Если используются<auto_unlink>крючки и указаны эти варианты, будет поднято статическое утверждение.
Теперь рассмотрим небольшой пример с использованием обоих крючков:
#include<boost/intrusive/slist.hpp>#include<vector>usingnamespaceboost::intrusive;//This is a base hookclassMyClass:publicslist_base_hook<>{intint_;public://This is a member hookslist_member_hook<>member_hook_;MyClass(inti):int_(i){}};//Define an slist that will store MyClass using the public base hooktypedefslist<MyClass>BaseList;//Define an slist that will store MyClass using the public member hooktypedefmember_hook<MyClass,slist_member_hook<>,&MyClass::member_hook_>MemberOption;typedefslist<MyClass,MemberOption>MemberList;intmain(){typedefstd::vector<MyClass>::iteratorVectIt;typedefstd::vector<MyClass>::reverse_iteratorVectRit;//Create several MyClass objects, each one with a different valuestd::vector<MyClass>values;for(inti=0;i<100;++i)values.push_back(MyClass(i));BaseListbaselist;MemberListmemberlist;//Now insert them in the reverse order in the base hook listfor(VectItit(values.begin()),itend(values.end());it!=itend;++it)baselist.push_front(*it);//Now insert them in the same order as in vector in the member hook listfor(BaseList::iteratorit(baselist.begin()),itend(baselist.end());it!=itend;++it){memberlist.push_front(*it);}//Now test lists{BaseList::iteratorbit(baselist.begin());MemberList::iteratormit(memberlist.begin());VectRitrit(values.rbegin()),ritend(values.rend());VectItit(values.begin()),itend(values.end());//Test the objects inserted in the base hook listfor(;rit!=ritend;++rit,++bit)if(&*bit!=&*rit)return1;//Test the objects inserted in the member hook listfor(;it!=itend;++it,++mit)if(&*mit!=&*it)return1;}return0;}
Статья Intrusive singly linked list: slist раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 17. Boost.Intrusive может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.