在线文档教程
C++
迭代器 | Iterator

std::iterator_traits

STD:迭代器[医]性状

Defined in header
template< class Iterator> struct iterator_traits;
template< class T > struct iterator_traits<T*>;
template< class T > struct iterator_traits<const T*>;

std::iterator_traits属性提供统一接口的类型特质类。Iterator类型。这使得仅以迭代器实现算法成为可能。

该类定义以下类型:

  • difference_type-一种可用于识别迭代器之间距离的类型

  • value_type-取消引用迭代器可以获得的值的类型。这种类型是void用于输出迭代器。

  • pointer-定义指向在%28上迭代的类型的指针value_type%29

  • reference-定义对在%28上迭代的类型的引用value_type%29

  • iterator_category-迭代器的类别。一定是迭代器类别标签...

模板可以专门用于用户定义的迭代器,以便可以检索有关迭代器的信息,即使类型不提供通常的类型。

模板参数

Iterator-the iterator type to retrieve properties for

成员类型

Member typeDefinition
difference_typeIterator::difference_type
value_typeIterator::value_type
pointerIterator::pointer
referenceIterator::reference
iterator_categoryIterator::iterator_category

If Iterator does not have the five member types difference_type, value_type, pointer, reference, and iterator_category, then this template has no members by any of those names (std::iterator_traits is SFINAE-friendly).(since C++17)

专门性

这种类型特征可以专门用于用户提供的类型,这些类型可以用作迭代器。标准库为指针类型T提供了两个部分的专门化%2A,这使得使用所有基于迭代器的算法和原始指针成为可能。

T*专门化成员类型

Member typeDefinition
difference_typestd::ptrdiff_t
value_typeT
pointerT*
referenceT&
iterator_categorystd::random_access_iterator_tag

const T*专门化成员类型

Member typeDefinition
difference_typestd::ptrdiff_t
value_typeT
pointerconst T*
referenceconst T&
iterator_categorystd::random_access_iterator_tag

下面的示例显示了一个通用的reverse()双向迭代器的实现。

二次

#include <iostream> #include <iterator> #include <vector> #include <list> template<class BidirIt> void my_reverse(BidirIt first, BidirIt last) { typename std::iterator_traits<BidirIt>::difference_type n = std::distance(first, last --n; while(n > 0) { typename std::iterator_traits<BidirIt>::value_type tmp = *first; *first++ = *--last; *last = tmp; n -= 2; } } int main() { std::vector<int> v{1, 2, 3, 4, 5}; my_reverse(v.begin(), v.end() for (int n : v) { std::cout << n << ' '; } std::cout << '\n'; std::list<int> l{1, 2, 3, 4, 5}; my_reverse(l.begin(), l.end() for (auto n : l) { std::cout << n << ' '; } std::cout << '\n'; int a[] = {1, 2, 3, 4, 5}; my_reverse(a, a+5 for (int i=0; i<5; ++i) { std::cout << a[i] << ' '; } std::cout << '\n'; // std::istreambuf_iterator<char> i1(std::cin), i2; // my_reverse(i1, i2 // compilation error }

二次

产出:

二次

5 4 3 2 1 5 4 3 2 1 5 4 3 2 1

二次

另见

iterator (deprecated in C++17)base class to ease the definition of required types for simple iterators (class template)
input_iterator_tagoutput_iterator_tagforward_iterator_tagbidirectional_iterator_tagrandom_access_iterator_tagempty class types used to indicate iterator categories (class)

© cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

http://en.cppreference.com/w/cpp/iterator/iterator[医]性状