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 type | Definition |
---|---|
difference_type | Iterator::difference_type |
value_type | Iterator::value_type |
pointer | Iterator::pointer |
reference | Iterator::reference |
iterator_category | Iterator::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 type | Definition |
---|---|
difference_type | std::ptrdiff_t |
value_type | T |
pointer | T* |
reference | T& |
iterator_category | std::random_access_iterator_tag |
const T*专门化成员类型
Member type | Definition |
---|---|
difference_type | std::ptrdiff_t |
value_type | T |
pointer | const T* |
reference | const T& |
iterator_category | std::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_tag | empty class types used to indicate iterator categories (class) |
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。