Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Intrusive splay tree based associative containers: splay_set, splay_multiset and , splay_tree

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 17. Boost.Intrusive

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Ассоциативные контейнеры C++ обычно основаны на реализациях красно-черного дерева (например, STL, Boost.Intrusive ассоциативные контейнеры). Однако есть и другие интересные структуры данных, которые предлагают некоторые преимущества (а также недостатки).

Деревья Splay — это саморегулирующиеся деревья двоичного поиска, обычно используемые в кэшах, распределителях памяти и других приложениях, потому что деревья Splay имеют «эффект кэширования»: недавно доступные элементы имеют лучшее время доступа, чем элементы, доступные реже. Для получения дополнительной информации о деревьях сплея см.соответствующую запись Википедии.

Навязчивыйпредлагает 3 контейнера на основе деревьев сплей:<splay_set>,<splay_multiset>и<splaytree>. Первые два похожи на<set>или<multiset>, а последний представляет собой обобщение, которое предлагает функции как для вставки уникальных, так и нескольких ключей.

Память над этими контейнерами с Boost. Навязчивые крючки обычно составляют 3 указателя. Пустой, непостоянный размер игрового контейнера также имеет размер 3 указателя.

Назойливые контейнеры на основе дерева Splay имеют логарифмическую сложность во многих операциях, таких как поиски, вставки, стирания и т. Д., Но если некоторые элементы чаще доступны, чем другие, деревья Splay выполняют более быстрый поиск, чем эквивалентные сбалансированные бинарные деревья (например, красно-черные деревья).

Эффект кэширования, предлагаемый сплей-деревьями, имеет свою цену: дерево должно быть сбалансировано при поиске элемента. Для поддержания правильности и гарантии безопасности потока этот эффект кэширования не обновляется, когда называются конст-версии поисковых функций, таких как<find()>,<lower_bound()>,<upper_bound()>,<equal_range()>,<count()>. Это означает, что использование ассоциативных контейнеров на основе splay-tree в качестве замены<set>/<multiset>, специально для функций поиска const, может не привести к желаемым улучшениям производительности.

Если поиск элементов рандомизирован, дерево будет постоянно уравновешено, не воспользовавшись эффектом кэша, поэтому деревья сплея могут обеспечить худшую производительность, чем другие сбалансированные деревья, для нескольких шаблонов поиска.

Навязчивыеигровые ассоциативные контейнеры используют не свои собственные типы крючков, а простые древовидные крючки для двоичного поиска.Бинарные крючки деревьев поиска: bs_set_base_hook и bs_set_member_hookраздел для получения дополнительной информации об этих крючках.

template <class T, class ...Options>
class splay_set;
template <class T, class ...Options>
class splay_multiset;
template <class T, class ...Options>
class splaytree;

Эти контейнеры получают те же опции, описанные в разделе. Как использовать Boost.Intrusive

  • <base_hook<classHook>>/<member_hook<classT,classHook,HookT::*PtrToMember>>/<value_traits<classValueTraits>>: Чтобы указать тип крючка или характеристики значения, используемые для настройки контейнера. (Чтобы узнать о ценностных чертах, перейдите в разделКонтейнеры с пользовательскими ValueTraits.)
  • <constant_time_size<boolEnabled>>: Для активации постоянной работы<size()>. Дефолт:<constant_time_size<true>>
  • <size_type<boolEnabled>>: Указать тип, который будет использоваться для хранения размера контейнера. Дефолт:<size_type<std::size_t>>

Также они могут получить дополнительную опцию:

  • <compare<classCompare>>: Функция сравнения для объектов, которые вставляются в контейнеры. Сравнительный функтор должен вызывать строгий слабый порядок. Дефолт:<compare< std::less<key_type> >>
  • <key_of_value<classKeyOfValueFunctionObject>>: Объект функции, который будет определять<key_type>типа значения, которое должно храниться. Этот тип позволит использовать картографический интерфейс.Карта и многокарточный интерфейс с множеством и множествомдля деталей. По умолчанию<key_type>равно<value_type>(набороподобный интерфейс).

Теперь рассмотрим небольшой пример с использованием контейнеров<splay_set>/<splay_multiset>:

#include <boost/intrusive/splay_set.hpp>
#include <vector>
#include <functional>
using namespace boost::intrusive;
class mytag;
class MyClass
   : public bs_set_base_hook<>
{
   int int_;
   public:
   //This is a member hook
   bs_set_member_hook<> member_hook_;
   MyClass(int i)
      :  int_(i)
      {}
   friend bool operator< (const MyClass &a, const MyClass &b)
      {  return a.int_ < b.int_;  }
   friend bool operator> (const MyClass &a, const MyClass &b)
      {  return a.int_ > b.int_;  }
   friend bool operator== (const MyClass &a, const MyClass &b)
      {  return a.int_ == b.int_;  }
};
//Define a set using the base hook that will store values in reverse order
typedef splay_set< MyClass, compare<std::greater<MyClass> > >     BaseSplaySet;
//Define an multiset using the member hook
typedef member_hook<MyClass, bs_set_member_hook<>, &MyClass::member_hook_> MemberOption;
typedef splay_multiset< MyClass, MemberOption>   MemberSplayMultiset;
int main()
{
   typedef std::vector<MyClass>::iterator VectIt;
   //Create several MyClass objects, each one with a different value
   std::vector<MyClass> values;
   for(int i = 0; i < 100; ++i)  values.push_back(MyClass(i));
   BaseSplaySet   baseset;
   MemberSplayMultiset membermultiset;
   //Insert values in the container
   for(VectIt it(values.begin()), itend(values.end()); it != itend; ++it){
      baseset.insert(*it);
      membermultiset.insert(*it);
   }
   //Now test sets
   {
      BaseSplaySet::reverse_iterator rbit(baseset.rbegin());
      MemberSplayMultiset::iterator mit(membermultiset.begin());
      VectIt it(values.begin()), itend(values.end());
      //Test the objects inserted in the base hook set
      for(; it != itend; ++it, ++rbit){
         if(&*rbit != &*it)   return 1;
      }
      //Test the objects inserted in member and binary search hook sets
      for(it = values.begin(); it != itend; ++it, ++mit){
         if(&*mit != &*it)    return 1;
      }
   }
   return 0;
}

PrevUpHomeNext

Статья Intrusive splay tree based associative containers: splay_set, splay_multiset and , splay_tree раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 17. Boost.Intrusive может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 17. Boost.Intrusive ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:10:20/0.029942035675049/1