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

Boost Pointer Container Library

Boost , ,

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

Boost Pointer Container Library

Author: Торстен Оттосен
Contact: Всякий раз, когда программист хочет иметь контейнер указателей на кучу объектов, обычно есть только один безопасный способ: сделать контейнер умных указателей, таких какboost::shared_ptrЭтот подход является неоптимальным, если

  1. хранимые объекты не являются общими, а принадлежат исключительно, или
  1. Накладные расходы, подразумеваемые умными указателями, неуместны

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

Преимуществом контейнеров является

  1. Безопасное хранение указателей и манипуляции.
  1. Нотационное удобство по сравнению с использованием контейнеров указателей.
  1. Может использоваться для типов, которые не являются ни пригодными, ни пригодными для копирования.
  1. Никакие накладные расходы на память как контейнеры умных указателей не могут иметь (см.и)..
  1. Обычно быстрее, чем при использовании контейнеров с умными указателями (см.и).).
  1. Интерфейс немного изменен в сторону домена указателей вместо того, чтобы полагаться на обычный интерфейс на основе значений. Например, теперь можно дляpop_back()вернуть удаленный элемент.
  1. Распространяет константу так, что нельзя модифицировать объекты черезconst_iterator.
  1. Встроенная поддержка семантики глубокого копирования с помощью концепцииClonable

Недостатками являются

  1. Менее гибкие, чем контейнеры интеллектуальных указателей, таких какboost::shared_ptr

Когда вам нужна общая семантика, эта библиотека не то, что вам нужно.

Upgrading from Boost v. 1.33.*

Если вы перешли с одной из этих версий Boost, то произошло одно существенное изменение интерфейса: итераторы карт теперь имитируют итераторы изstd::map.. Ранее вы могли написать

for( boost::ptr_map<std::string,T>::iterator i = m.begin(), e = m.end();
     i != e; ++i )
{
  std::cout << "key:" << i.key();
  std::cout << "value:" << *i;
  i->foo(); // call T::foo()
}

Теперь это необходимо преобразовать в

for( boost::ptr_map<std::string,T>::iterator i = m.begin(), e = m.end();
     i != e; ++i )
{
  std::cout << "key:" << i->first;
  std::cout << "value:" << *i->second;
  i->second->foo(); // call T::foo()
}

Помимо вышеперечисленных изменений, в настоящее время библиотека также представляет

  • std::auto_ptrперегрузки:

    std::auto_ptr<T> p( new T );
    container.push_back( p );
    
  • Преобразование впередача:

    boost::ptr_vector<Base>  vec;
    boost::ptr_list<Derived> list;
    ...
    vec.transfer( vec.begin(), list ); // now ok
    

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

Upgrading from Boost v. 1.34.*

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

Все контейнеры теперь можно копировать и присваивать. Вы можете, например, сделать:

boost::ptr_vector<Derived> derived = ...;
boost::ptr_vector<Base>    base( derived );
base = derived;

Как показывает пример, также допускаются преобразования класса производных к базовому.

Добавлены некоторые общие функции:

VoidPtrContainer&       base();
const VoidPtrContainer& base() const;

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

В последовательности добавлено несколько новых функций:

void resize( size_type size );
void resize( size_type size, T* to_clone );

ptr_vectorимеет несколько новых вспомогательных функций для лучшей интеграции с C-массивами:

void transfer( iterator before, T** from, size_type size, bool delete_from = true );
T**  c_array();

Наконец, теперь вы можете также "copy" и "assign" aauto_typeptr, позвонивmove():

boost::ptr_vector<T>::auto_type move_ptr = ...;
return boost::ptr_container::move( move_ptr );

Upgrading from Boost v. 1.35.*

Библиотека была довольно стабильной, но было поддержано несколько новых контейнеров:

  • boost::ptr_unordered_setin
  • boost::ptr_unordered_mapin
  • boost::ptr_circular_bufferin

Пока нет документов для этих классов, но они почти идентичныboost::ptr_set,boost::ptr_mapиboost::ptr_arrayсоответственно. Базовые контейнеры происходят из двух бустерных библиотек.

Кроме того, были добавленыитераторы.

Future Developments

Есть признаки того, чтопустотареализация имеет незначительные накладные расходы по сравнению сT*на основе реализации. Кроме того, реализация на основеT*намного проще в использовании с алгоритмами. Поэтому я ожидаю перехода кT*на основе реализации.

Кроме того, может быть разрешено, чтобы клон-распределитель имел состояние. Этот дизайн требует некоторой мысли, поэтому, если у вас есть хорошие идеи и варианты использования для этого, пожалуйста, не стесняйтесь связаться со мной.

Кроме того, поддержка Boost. Interprocess входит в список Todo.

Было несколько запросов наповышение::ptr_multi_index_container. Я исследовал, как это будет трудно, и это оказалось трудно, хотя и не невозможно. Но у меня нет ресурсов для реализации этого зверя на долгие годы, поэтому, если кому-то действительно нужен этот контейнер, я предлагаю им поговорить со мной наедине о том, как это можно сделать.

Acknowledgements

Следующие люди были очень полезны:

  • Бьорн Д. Расмуссен непреднамеренно мотивировал меня открыть эту библиотеку
  • Павел Возенилек попросил меня сделать адаптеры
  • Давид Абрахамс длякосвенногодизайна
  • Павол Дроба стал менеджером по обзору
  • Росс Бойлан опробовал прототип
  • Фелипе Магно де Алмейда за обратную связь, основанную на использовании библиотеки в производственном коде еще до того, как библиотека была частью повышения.
  • Джонатан Турканис (Jonathan Turkanis) для обеспечения своей структурыmove_ptr, которая используется внутри
  • Стефан Слапета и Говард Хиннант для поддержки Metrowerks
  • Рассел Помощь в совместимости с Borland
  • Джонатан Уэйкли за большую помощь в совместимости GCC и исправлении ошибок
  • Павел Чикулаев за комментарии и исправления ошибок
  • Андреас Хоммель за исправление неприятного бага Metrowerks
  • Чарльз Брокман за многочисленные комментарии к документации
  • Себастьян Рамачер для реализации опциональной поддержки сериализации

References

[1]Matt Austern:"The Standard Librarian: Containers of Pointers", C/C++ Форум экспертов журнала пользователей.
[2]Bjarne Stroustrup, "The C++ Programming Language",Appendix E: "Standard-Library Exception Safety"
[3]Herb Sutter, "Исключительный C++".
[4]Herb Sutter, "More Exceptional C++".
[5]Kevlin Henney:"From Mechanism to Method: The Safe Stacking of Cats", C++ Experts Forum, February 2002.
[6]Некоторые из нескольких предыдущих попыток указательных контейнеров, которые я видел, довольно интересныNTLиPointainer. На момент написания этой статьи обе библиотеки не являются исключениями и могут просачиваться.
[7]Международный стандарт, языки программирования - C++, ISO/IEC 14882, 1998. В частности, раздел 23.
[8]C++ Standard Library Closed Issues List (Revision 27), Item 218,Алгоритмы не используют двоичные объекты предикатов для сравнения по умолчанию.
[9]C++ Standard Library Active Issues List (Revision 27), Item 226,Пользователь предоставил специализации или перегрузки шаблонов функций std пространства имен.
[10]Harald Nowak "A remove_if for vector", C/C++ Users Journal, июль 2001.
[11]1,2]Усилить умный указательтаймингов
[12]1,2НТЛ: Array vs std::vector и boost::shared_ptr
[13]Kevlin Henney,Null Object, 2002.

Copyright:Thorsten Ottosen 2004-2006.

Статья Boost Pointer Container Library раздела может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: ::


реклама


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

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