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

Erasing and disposing values from 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

Одной из самых утомительных задач при использовании интрузивных контейнеров является управление стертыми элементами. При использовании STL-контейнеров сам контейнер отсоединяется и разрушает содержащиеся в нем элементы, но с помощью инвазивных контейнеров пользователь должен явно уничтожить объект после стирания элемента из контейнера. Это делает STL-подобные функции, стирающие несколько объектов, бесполезными: пользователь не может уничтожить каждый стертый элемент. Например, возьмем функцию<remove_if>из<list>:

template<class Pred>
void remove_if(Pred pred);

Как пользователь может уничтожить элементы (скажем, используя<operator delete>), которые будут стерты в соответствии с предикатом?НавязчивыйКонтейнеры предлагают дополнительные функции, которые принимают функциональный объект, который будет называться после того, как элемент был стерт из контейнера. Например,<list>предлагает:

template<class Pred, class Disposer>
void remove_and_dispose_if(Pred pred, Disposer disposer)

С помощью этой функции пользователь может эффективно удалять и уничтожать элементы, если функция утилизатора разрушает объект:<remove_and_dispose_if>будет называть объект функции «утилизатора» для каждого удаленного элемента.<list>предлагает больше функций, принимая объект функции дисперсии в качестве аргумента, например<erase_and_dispose>,<clear_and_dispose>,<remove_and_dispose>и т. д.

Обратите внимание, что диспозиционная функция не должна просто разрушать объект. Он может выполнять любые другие операции, такие как вставка удаленного объекта в другой контейнер. Рассмотрим небольшой пример:

#include <boost/intrusive/list.hpp>
using namespace boost::intrusive;
//A class that can be inserted in an intrusive list
class my_class : public list_base_hook<>
{
   public:
   my_class(int i)
      :  int_(i)
   {}
   int int_;
   //...
};
//Definition of the intrusive list
typedef list<my_class> my_class_list;
//The predicate function
struct is_even
{
   bool operator()(const my_class &c) const
   {  return 0 == (c.int_ % 2);  }
};
//The disposer object function
struct delete_disposer
{
   void operator()(my_class *delete_this)
   {  delete delete_this;  }
};
int main()
{
   const int MaxElem = 100;
   //Fill all the nodes and insert them in the list
   my_class_list list;
   try{
      //Insert new objects in the container
      for(int i = 0; i < MaxElem; ++i) list.push_back(*new my_class(i));
      //Now use remove_and_dispose_if to erase and delete the objects
      list.remove_and_dispose_if(is_even(), delete_disposer());
   }
   catch(...){
      //If something throws, make sure that all the memory is freed
      list.clear_and_dispose(delete_disposer());
      throw;
   }
   //Dispose remaining elements
   list.erase_and_dispose(list.begin(), list.end(), delete_disposer());
   return 0;
}

Все контейнерыBoost.Intrusiveпредлагают эти дополнительные элементы для всех функций, которые стирают элемент из контейнера.


PrevUpHomeNext

Статья Erasing and disposing values from 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 17:39:10/0.026403903961182/1