|  | 
|      | 
|  | 
| 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 | ||||||||||||||||||||||||||