![]() |
![]() ![]() ![]() ![]() |
![]() |
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 | ||||||||||||||||||||||||||