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

Cloning Boost.Intrusive containers

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

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

Для облегчения реализации конструкторов копий и операторов присвоения классов, содержащихBoost.Intrusiveконтейнеры, всеBoost.Intrusiveконтейнеры предлагают специальную функцию клонирования под названиемClone_from.

Помимо клонируемого контейнераклон_ изпринимает в качестве аргументов два функциональных объекта. Например, рассмотримклон_ изфункции членасписка:

template <class Cloner, class Disposer>
void clone_from(const list &src, Cloner cloner, Disposer disposer);

Эта функция сделает*этоклонsrc. Давайте объясним аргументы:

  • Первым параметром является список подлежащих клонированию.
  • Второй параметр — функциональный объект, который будет клонироватьзначение_типобъекты и возвращать указатель на клон. Он должен выполнять следующую функцию:указательоператор()constзначение_тип&].
  • Второй параметр — объект функции, который будет располагатьзначением_типаобъектов. Сначала он используется для опорожнения контейнера перед клонированием и утилизации элементов, если заброшено исключение.

Функция клонирования работает следующим образом:

  • Сначала он очищает и утилизирует все элементы от этого с помощью объекта функции диспергатора.
  • После этого он начинает клонирование всех элементов исходного контейнера с помощью объекта функции клонера.
  • Если выполняется какая-либо операция в функции клонирования (например, объект функции клонера), все сконструированные элементы утилизируются с использованием объекта функции клонирования.

Вот примерклона:

#include <boost/intrusive/list.hpp>
#include <iostream>
#include <vector>
using namespace boost::intrusive;
//A class that can be inserted in an intrusive list
class my_class : public list_base_hook<>
{
   public:
   friend bool operator==(const my_class &a, const my_class &b)
   {  return a.int_ == b.int_;   }
   int int_;
   //...
};
//Definition of the intrusive list
typedef list<my_class> my_class_list;
//Cloner object function
struct new_cloner
{
   my_class *operator()(const my_class &clone_this)
   {  return new my_class(clone_this);  }
};
//The disposer object function
struct delete_disposer
{
   void operator()(my_class *delete_this)
   {  delete delete_this;  }
};
int main()
{
   const int MaxElem = 100;
   std::vector<my_class> nodes(MaxElem);
   //Fill all the nodes and insert them in the list
   my_class_list list;
   for(int i = 0; i < MaxElem; ++i) nodes[i].int_ = i;
   list.insert(list.end(), nodes.begin(), nodes.end());
   //Now clone "list" using "new" and "delete" object functions
   my_class_list cloned_list;
   cloned_list.clone_from(list, new_cloner(), delete_disposer());
   //Test that both are equal
   if(cloned_list != list)
      std::cout << "Both lists are different" << std::endl;
   else
      std::cout << "Both lists are equal" << std::endl;
   //Don't forget to free the memory from the second list
   cloned_list.clear_and_dispose(delete_disposer());
   return 0;
}

PrevUpHomeNext

Статья Cloning Boost.Intrusive containers раздела 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 16:40:08/0.0085880756378174/1