Поделиться через


Структура random_access_iterator_tag

Класс, предоставляющий возвращаемый тип для функции iterator_category, которая представляет произвольно-доступный итератор.

struct random_access_iterator_tag 
   : public bidirectional_iterator_tag {};

Заметки

Классы тега категории используются как компилируют теги для выделения алгоритма. Функции шаблона необходимо найти наиболее определенной категории своего аргумента итератора, чтобы он мог использовать наиболее эффективный алгоритм во время компиляции. Для каждого типа итератора Iterator, iterator_traits<Iterator>::iterator_category должны быть самым указанным тегом категории, описывающий расширение функциональности итератора.

Тип совпадает с ::iterator_category по iterator<Iter>Iter описывает объект, который можно использовать как произвольно-доступный итератор.

Пример

// iterator_rait.cpp
// compile with: /EHsc
#include <iterator>
#include <vector>
#include <iostream>
#include <list>

using namespace std;

int main( )
{
   vector<int> vi;
   vector<char> vc;
   list<char> lc;
   iterator_traits<vector<int>:: iterator>::iterator_category cati;
   iterator_traits<vector<char>:: iterator>::iterator_category catc;
   iterator_traits<list<char>:: iterator>::iterator_category catlc;

   // These are both random-access iterators
   cout << "The type of iterator for vector<int> is "
       << "identified by the tag:\n " 
       << typeid ( cati ).name( ) << endl;
   cout << "The type of iterator for vector<char> is "
       << "identified by the tag:\n " 
       << typeid ( catc ).name( ) << endl;
   if ( typeid ( cati ) == typeid( catc ) )
      cout << "The iterators are the same." << endl << endl;
   else
      cout << "The iterators are not the same." << endl << endl;

   // But the list iterator is bidirectinal, not random access
   cout << "The type of iterator for list<char> is "
       << "identified by the tag:\n " 
       << typeid (catlc).name( ) << endl;

   // cout << ( typeid ( vi.begin( ) ) == typeid( vc.begin( ) ) ) << endl;
   if ( typeid ( vi.begin( ) ) == typeid( vc.begin( ) ) )
      cout << "The iterators are the same." << endl;
   else
      cout << "The iterators are not the same." << endl;
   // A random-access iterator is a bidirectional iterator.
   cout << ( void* ) dynamic_cast< iterator_traits<list<char>:: iterator>
          ::iterator_category* > ( &catc ) << endl;
}

Пример результатов выполнения

Следующий результат для x86.

The type of iterator for vector<int> is identified by the tag:
 struct std::random_access_iterator_tag
The type of iterator for vector<char> is identified by the tag:
 struct std::random_access_iterator_tag
The iterators are the same.

The type of iterator for list<char> is identified by the tag:
 struct std::bidirectional_iterator_tag
The iterators are not the same.
0012FF3B

Требования

Заголовок:<iterator>

Пространство имен: std

См. также

Ссылки

Структура bidirectional_iterator_tag

Потокобезопасность в стандартной библиотеке C++

Библиотека стандартных шаблонов