首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

std::iterator_traits

Defined in header <iterator>

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()双向迭代器的实现。

二次

代码语言:javascript
复制
#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
 
}

二次

产出:

二次

代码语言:javascript
复制
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)

代码语言:txt
复制
 © cppreference.com

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

扫码关注腾讯云开发者

领取腾讯云代金券