![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
The Boost.Iterator Library BoostBoost , ,
|
Authors: | David Abrahams, Jeremy Siek, Thomas Witt |
---|---|
Contact: | dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com |
organizations: | Boost Consulting, Indiana University Open Systems Lab, Zephyr Associates, Inc. |
date: | $Date$ |
copyright: | Copyright David Abrahams, Jeremy Siek, Thomas Witt 2003. |
Abstract: | The Boost Iterator Library contains two parts. The first is a system of concepts which extend the C++ standard iterator requirements. The second is a framework of components for building iterators based on these extended concepts and includes several useful iterator adaptors. The extended iterator concepts have been carefully designed so that old-style iterators can fit in the new concepts and so that new-style iterators will be compatible with old-style algorithms, though algorithms may need to be updated if they want to take full advantage of the new-style iterator capabilities. Several components of this library have been accepted into the C++ standard technical report. The components of the Boost Iterator Library replace the older Boost Iterator Adaptor Library. |
---|
Table of Contents
Категории итераторов, определенные в C++98, чрезвычайно ограничены, потому что они связывают вместе два ортогональных понятия: проход и доступ к элементам. Например, поскольку итератор случайного доступа должен возвращать ссылку (а не прокси) при удалении, невозможно захватить возможности вектора.с использованием категорий C++98. Это печально известный "вектор
Standard Proposal For New-Style Iterators (PDF)
Написание стандартных итераторов сложно, но потребность часто возникает. Чтобы облегчить реализацию новых итераторов, Boost. Библиотека итераторов предоставляет шаблон классаiterator_facade, который реализует множество полезных по умолчанию и проверок времени компиляции, предназначенных для того, чтобы помочь автору итератора убедиться, что его итератор верен.
Также принято определять новый итератор, который похож на какой-то базовый итератор или тип, похожий на итератор, но который изменяет некоторые аспекты поведения основного типа. Для этой цели библиотека предоставляет шаблон классаiterator_adaptor, который специально разработан, чтобы использовать как можно больше поведения основного типа.
Документацию по этим двум классам можно найти на следующих веб-страницах:
Какiterator_facade, так иiterator_adaptor, а также многие изспециализированных адаптеров, упомянутых ниже, были предложены для стандартизации и приняты в первый технический отчет C++; см.
Standard Proposal For Iterator Facade and Adaptor (PDF)
для более подробной информации.
Библиотека итераторов предоставляет полезный набор стандартных шаблонов итераторов на основе фасада и адаптера итератора Boost.
If you have been using the old Boost Iterator Adaptor library to implement iterators, you probably wrote a Policies class which captures the core operations of your iterator. In the new library design, you'll move those same core operations into the body of the iterator class itself. If you were writing a family of iterators, you probably wrote a type generator to build the iterator_adaptor specialization you needed; in the new library design you don't need a type generator (though may want to keep it around as a compatibility aid for older code) because, due to the use of the Curiously Recurring Template Pattern (CRTP) [Cop95], you can now define the iterator class yourself and acquire functionality through inheritance from iterator_facade or iterator_adaptor. As a result, you also get much finer control over how your iterator works: you can add additional constructors, or even override the iterator functionality provided by the library.
Если вы ищете старый компонентprojection_iterator, его функциональность была объединена вtransform_iterator: до тех пор, пока объект функцииresult_type(илиСсылкааргумент шаблона, если явно указан) является истинным типом ссылки,Transform_iteratorбудет вести себя какProjection_iterator, к которому привыкли.
В 2000 году Дэйв Абрахамс писал итератор для контейнера указателей, который имел бы доступ к заостренным элементам. Естественно, будучи библиотечным писателем, он решил обобщить идею и родилась библиотека адаптеров Boost Iterator. Дэйв был вдохновлен некоторыми работами Андрея Александреску и выбрал дизайн, основанный на политике (хотя он, вероятно, не очень хорошо уловил идею Андрея - был только один класс политики для всех ортогональных свойств итератора). Вскоре Джереми Сик понял, что ему понадобится библиотека, и они вместе работали над созданием версии, которая была рассмотрена и принята в библиотеку. Они написали статью и внесли несколько важных изменений в кодекс.
В конце концов, несколько недостатков старой библиотеки стали делать необходимость переписывания очевидной. Дэйв и Джереми начали работать на заседании комитета по C++ в Санта-Крусе в 2002 году и быстро создали рабочий прототип. По настоянию Мата Маркуса они решили использовать подход GenVoca/CRTP и перенесли политику в класс итераторов. Томас Витт выразил заинтересованность и стал голосом строгой проверки времени компиляции для проекта, добавив использование техники SFINAE для устранения ложного преобразования конструкторов и операторов из набора перегрузок. Он также признал необходимость отдельногоитератора_фасадаи выделил его изитератора_адаптора. Наконец, после почти полного переписывания прототипа, они придумали библиотеку, которую вы видите сегодня.
[Cop95] | [Coplien, 1995] Coplien, J., Curiously Recurring Template Patterns, C++ Report, February 1995, pp. |
Статья The Boost.Iterator Library Boost раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: ::
реклама |