std::iterator_traits

来自cppreference.com
< cpp‎ | iterator
 
 
迭代器库
迭代器原语
原文:
Iterator primitives
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
iterator_traits
input_iterator_tag
output_iterator_tag
forward_iterator_tag
bidirectional_iterator_tag
random_access_iterator_tag
iterator
迭代器适配器
原文:
Iterator adaptors
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
reverse_iterator
流迭代器
原文:
Stream iterators
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
istream_iterator
ostream_iterator
istreambuf_iterator
ostreambuf_iterator
迭代器操作
原文:
Iterator operations
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
advance
distance
prev(C++11)
next(C++11)
远程接入
原文:
Range access
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
begin(C++11)
end(C++11)
 
在头文件 <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 是类型特征类,为迭代器类型的属性提供统一的接口,使得能够仅针对迭代器实现算法。

该类定义了如下类型,与 std::iterator 中的类型定义相对应:

  • difference_type - 可用来标示迭代器间距的类型
  • value_type - 迭代器解除引用后所得到的值的类型。对输出迭代器而言,该类型为 void
  • pointer - 指向被迭代类型(value_type)的指针
  • reference - 被迭代类型(value_type)的引用类型
  • iterator_category - 迭代器分类。必须是迭代器分类标签之一。

可以针对用户自定义迭代器特化该模版,这样,即便该类型没有提供一般的类型定义,也能获取关于该迭代器的信息。

目录

[编辑] 模版参数

Iterator - 需要取得与之相关属性的迭代器类型

[编辑] 成员类型

成员类型 定义
difference_type Iterator::difference_type
value_type Iterator::value_type
pointer Iterator::pointer
reference Iterator::reference
iterator_category Iterator::iterator_category

[编辑] 特化

如果要把用户提供的类型作为迭代器使用,该类型特征可以针对这一类型进行特化。标准库中提供了针对指针类型 T * 的两种偏特化,使得可以在任何需要迭代器的算法里使用裸指针。

[编辑] 针对 T * 特化的成员类型

成员类型 Definition
difference_type std::ptrdiff_t
value_type T
pointer T*
reference T&
iterator_category std::random_access_iterator_tag

[编辑] 针对 const T * 特化的成员类型

成员类型 定义
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 BDIter>
void my_reverse(BDIter first, BDIter last)
{
    typename std::iterator_traits<BDIter>::difference_type n = std::distance(first, last);
    --n;
    while(n > 0) {
        typename std::iterator_traits<BDIter>::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';
 
//    std::istreambuf_iterator<char> i1(std::cin), i2;
//    my_reverse(i1, i2); // compilation error
 
}

输出:

5 4 3 2 1
5 4 3 2 1

[编辑] 相关条目

基本的迭代器
原文:
the basic iterator
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

(类模板) [edit]
空类类型用来表示迭代器类别
原文:
empty class types used to indicate iterator categories
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

(类) [edit]