![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Counting IteratorBoost , ,
|
Author: | Дэвид Абрахамс, Джереми Сик, Томас Витт | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Contact: | ЕслиРазницааргументТогдаРазница_типявляется неопределенным интегральным типом. В противном случаеdifference_typeРазница.
итератор_категорияопределяется по следующему алгоритму: if (CategoryOrTraversal is not use_default) return CategoryOrTraversal else if (numeric_limits<Incrementable>::is_specialized) return iterator-category( random_access_traversal_tag, Incrementable, const Incrementable&) else return iterator-category( iterator_traversal<Incrementable>::type, Incrementable, const Incrementable&)
counting_iterator requirementsаргумент должен быть копируемым и уступчивым. Еслиiterator_categoryконвертируется вforward_iterator_tagилиforward_traversal_tag, то должно быть хорошо сформировано следующее: Incrementable i, j; ++i; // pre-increment i == j; // operator equal Еслиiterator_categoryконвертируется вbidirectional_iterator_tagилиbidirectional_traversal_tag, то должно быть также хорошо сформировано следующее выражение: --i Еслиiterator_categoryконвертируется вrandom_access_iterator_tagилиrandom_access_traversal_tag, то должно быть также действительным следующее: counting_iterator::difference_type n; i += n; n = i - j; i < j; counting_iterator modelsСпециализацииcounting_iteratorмодели Readable Lvalue Iterator. Кроме того, они моделируют понятия, соответствующие тегам итератора, к которым ихитератор_категорияявляется конвертируемой. Если быCategoryOrTraversalне являетсяuse_default, затемcounting_iteratorмодели концепт, соответствующий тегу итератораКатегорияПутешествия. В противном случае, еслиnumeric_limits Counting_iterator counting_iterator operationsВ дополнение к операциям, требуемым концепциями, моделируемымиCounting_iterator,Counting_iteratorобеспечивает следующие операции. Counting_iterator();
counting_iterator (counting_iteratorconst&rhs);
явныйсчетчик_iterator(Incrementablex);
ссылкаоператор*()const;
counting_iterator&operator++();
counting_iterator&operator--();
Расширяемconst&base()const;
template <class Incrementable> counting_iterator<Incrementable> make_counting_iterator(Incrementable x);
ExampleЭтот пример заполняет массив цифрами и второй массив указателями в первый массив, используяcounting_iteratorдля обеих задач. Наконецindirect_iteratorиспользуется для распечатки чисел в первом массиве через опосредование через второй массив. int N = 7; std::vector<int> numbers; typedef std::vector<int>::iterator n_iter; std::copy(boost::counting_iterator<int>(0), boost::counting_iterator<int>(N), std::back_inserter(numbers)); std::vector<std::vector<int>::iterator> pointers; std::copy(boost::make_counting_iterator(numbers.begin()), boost::make_counting_iterator(numbers.end()), std::back_inserter(pointers)); std::cout << "indirectly printing out the numbers from 0 to " << N << std::endl; std::copy(boost::make_indirect_iterator(pointers.begin()), boost::make_indirect_iterator(pointers.end()), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; Результатом является: indirectly printing out the numbers from 0 to 7 0 1 2 3 4 5 6 Статья Counting Iterator раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
|||||||||||||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |