![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Boost Pointer Container LibraryBoost , ,
|
Author: | Торстен Оттосен | |||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Contact: | Всякий раз, когда программист хочет иметь контейнер указателей на кучу объектов, обычно есть только один безопасный способ: сделать контейнер умных указателей, таких как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() } Помимо вышеперечисленных изменений, в настоящее время библиотека также представляет
Также обратите внимание, чтоувеличивается. Назначениеобеспечивает лучшую поддержку указательных контейнеров. 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 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_set Кроме того, были добавленыитераторы. Future DevelopmentsЕсть признаки того, чтопустотареализация имеет незначительные накладные расходы по сравнению сT*на основе реализации. Кроме того, реализация на основеT*намного проще в использовании с алгоритмами. Поэтому я ожидаю перехода кT*на основе реализации. Кроме того, может быть разрешено, чтобы клон-распределитель имел состояние. Этот дизайн требует некоторой мысли, поэтому, если у вас есть хорошие идеи и варианты использования для этого, пожалуйста, не стесняйтесь связаться со мной. Кроме того, поддержка Boost. Interprocess входит в список Todo. Было несколько запросов наповышение::ptr_multi_index_container AcknowledgementsСледующие люди были очень полезны:
References
Статья Boost Pointer Container Library раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
|||||||||||||||||||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |