Списокявляется двойным. Память, которую он накладывает, составляет 2 указателя на узел. Пустой, непостоянный размерсписоктакже имеет размер 2 указателей.списокимеет гораздо больше операций в постоянное время, чемсписоки обеспечивает двунаправленный итератор. Рекомендуется использоватьсписоквместосписок, если допустим размер накладных расходов:
тег<классТег>(только для базовых крючков): Этот аргумент служит тегом, поэтому вы можете извлечь из более чем одного крючка списка.tag<default_tag>.
link_mode<link_mode_typeLinkMode>: Связывающая политика. По умолчанию:link_mode<safe_link>.
void_pointer<классVoidPointer>: Тип указателя, который должен использоваться внутри крючка и распространяться на контейнер. По умолчанию:void_pointer<void*>.
base_hook<Hook>member_hook<T,[ Чтобы указать тип крючка или характеристики значения, используемые для настройки контейнера. (Чтобы узнать о ценностных чертах, перейдите в разделКонтейнеры с пользовательскими ValueTraits.)
Constant_time_size<boolEnabled>: Для активации постоянной времениразмер()операция. По умолчанию:константа_время_размер<истинно>
size_type<boolEnabled>: Указать тип, который будет использоваться для хранения размера контейнера. По умолчанию:size_type<std::size_t>
Теперь рассмотрим небольшой пример с использованием обоих крючков:
#include<boost/intrusive/list.hpp>#include<vector>usingnamespaceboost::intrusive;classMyClass:publiclist_base_hook<>//This is a derivation hook{intint_;public://This is a member hooklist_member_hook<>member_hook_;MyClass(inti):int_(i){}};//Define a list that will store MyClass using the public base hooktypedeflist<MyClass>BaseList;//Define a list that will store MyClass using the public member hooktypedeflist<MyClass,member_hook<MyClass,list_member_hook<>,&MyClass::member_hook_>>MemberList;intmain(){typedefstd::vector<MyClass>::iteratorVectIt;//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(VectItit(values.begin()),itend(values.end());it!=itend;++it)memberlist.push_back(*it);//Now test lists{BaseList::reverse_iteratorrbit(baselist.rbegin());MemberList::iteratormit(memberlist.begin());VectItit(values.begin()),itend(values.end());//Test the objects inserted in the base hook listfor(;it!=itend;++it,++rbit)if(&*rbit!=&*it)return1;//Test the objects inserted in the member hook listfor(it=values.begin();it!=itend;++it,++mit)if(&*mit!=&*it)return1;}return0;}
Статья Intrusive doubly linked list: list раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 17. Boost.Intrusive может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.