Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Вспомогательная структура-шаблон, используется для указания всех критических определений типов, которые должен иметь итератор.
Синтаксис
struct iterator_traits {
typedef typename Iterator::iterator_category iterator_category;
typedef typename Iterator::value_type value_type;
typedef typename Iterator::difference_type difference_type;
typedef difference_type distance_type;
typedef typename Iterator::pointer pointer;
typedef typename Iterator::reference reference;
};
Замечания
Структура-шаблон определяет типы элементов
iterator_category: синоним дляIterator::iterator_category.value_type: синоним дляIterator::value_type.difference_type: синоним дляIterator::difference_type.distance_type: синоним дляIterator::difference_type.pointer: синоним дляIterator::pointer.reference: синоним дляIterator::reference.
Частичные специализации определяют критически важные типы, связанные с указателем типа типа * или const Type*.
В этой реализации вы также можете применить несколько шаблонов функций, которые не используют частичную специализацию:
template <class Category, class Type, class Diff>
C _Iter_cat(const iterator<Category, Ty, Diff>&);
template <class Ty>
random_access_iterator_tag _Iter_cat(const Ty *);
template <class Category, class Ty, class Diff>
Ty *val_type(const iterator<Category, Ty, Diff>&);
template <class Ty>
Ty *val_type(const Ty *);
template <class Category, class Ty, class Diff>
Diff *_Dist_type(const iterator<Category, Ty, Diff>&);
template <class Ty>
ptrdiff_t *_Dist_type(const Ty *);
что определяет некоторые из тех же типов более косвенно. Используйте эти функции как аргументы для вызова функции. Их единственной целью является предоставление полезного параметра шаблона класса вызываемой функции.
Пример
// iterator_traits.cpp
// compile with: /EHsc
#include <iostream>
#include <iterator>
#include <vector>
#include <list>
using namespace std;
template< class it >
void
function( it i1, it i2 )
{
iterator_traits<it>::iterator_category cat;
cout << typeid( cat ).name( ) << endl;
while ( i1 != i2 )
{
iterator_traits<it>::value_type x;
x = *i1;
cout << x << " ";
i1++;
}
cout << endl;
};
int main( )
{
vector<char> vc( 10,'a' );
list<int> li( 10 );
function( vc.begin( ), vc.end( ) );
function( li.begin( ), li.end( ) );
}
/* Output:
struct std::random_access_iterator_tag
a a a a a a a a a a
struct std::bidirectional_iterator_tag
0 0 0 0 0 0 0 0 0 0
*/
Требования
Заголовок:<итератор>
Пространство имен: std
См. также
<iterator>
Потокобезопасность в стандартной библиотеке C++
Справочник по стандартной библиотеке C++