跳到主要内容

6. iterators (迭代器)

定义迭代器类型、特性和适配器。头文件: <iterator>。


struct input_iterator_tag {}

输入迭代器标签。

  • 输入: 无
  • 输出: 标签类型
  • 注意: 支持 ++, *, ==; 单次读取

struct output_iterator_tag {}

输出迭代器标签。

  • 输入: 无
  • 输出: 标签类型
  • 注意: 支持 ++, *

struct forward_iterator_tag : input_iterator_tag {}

前向迭代器标签。

  • 输入: 无
  • 输出: 标签类型
  • 注意: 支持多次读取相同元素

struct bidirectional_iterator_tag : forward_iterator_tag {}

双向迭代器标签。

  • 输入: 无
  • 输出: 标签类型
  • 注意: 支持 --

struct random_access_iterator_tag : bidirectional_iterator_tag {}

随机访问迭代器标签。

  • 输入: 无
  • 输出: 标签类型
  • 注意: 支持 +, -, [], <

template <class Iterator> struct iterator_traits

迭代器特性萃取。

  • 输入: Iterator — 迭代器类型
  • 输出: 包含 value_type, difference_type, pointer, reference, iterator_category

template <class T> struct iterator_traits<T*>

指针特化。

  • 输入: T* — 指针类型
  • 输出: 指针的迭代器特性

template <class InputIterator, class Distance> void advance(InputIterator& i, Distance n)

前进 n 步。

  • 输入: i — 迭代器引用; n — 步数(可为负)
  • 输出: void
  • 注意: 对 bidirectional 和 random_access 迭代器支持负值

template <class InputIterator> typename iterator_traits<InputIterator>::difference_type distance(InputIterator first, InputIterator last)

计算距离。

  • 输入: first, last — 迭代器范围
  • 输出: difference_type — 距离

template <class InputIterator> InputIterator next(InputIterator x, typename iterator_traits<InputIterator>::difference_type n = 1)

获取后第 n 个迭代器。

  • 输入: x — 迭代器; n — 偏移(默认 1)
  • 输出: 新迭代器
  • 注意: C++11

template <class BidirectionalIterator> BidirectionalIterator prev(BidirectionalIterator x, typename iterator_traits<BidirectionalIterator>::difference_type n = 1)

获取前第 n 个迭代器。

  • 输入: x — 迭代器; n — 偏移(默认 1)
  • 输出: 新迭代器
  • 注意: C++11; 要求双向迭代器

template <class Iterator> class reverse_iterator

反向迭代器。

  • 输入: Iterator — 基础迭代器
  • 输出: 反向迭代器对象
  • 注意: ++ 变为 --,解引用指向当前前一个元素

template <class Iterator> reverse_iterator<Iterator> make_reverse_iterator(Iterator i)

创建反向迭代器。

  • 输入: i — 迭代器
  • 输出: reverse_iterator
  • 注意: C++14

template <class Iterator> class move_iterator

移动迭代器。

  • 输入: Iterator — 基础迭代器
  • 输出: 移动迭代器对象
  • 注意: 解引用返回右值引用

template <class Iterator> move_iterator<Iterator> make_move_iterator(const Iterator& i)

创建移动迭代器。

  • 输入: i — 迭代器
  • 输出: move_iterator

template <class Container> class back_insert_iterator

尾部插入迭代器。

  • 输入: Container — 容器类型
  • 输出: 插入迭代器对象
  • 注意: 赋值等效于 push_back

template <class Container> back_insert_iterator<Container> back_inserter(Container& x)

创建尾部插入器。

  • 输入: x — 容器
  • 输出: back_insert_iterator

template <class Container> class front_insert_iterator

头部插入迭代器。

  • 输入: Container — 容器类型
  • 输出: 插入迭代器对象
  • 注意: 赋值等效于 push_front

template <class Container> front_insert_iterator<Container> front_inserter(Container& x)

创建头部插入器。

  • 输入: x — 容器
  • 输出: front_insert_iterator

template <class Container> class insert_iterator

任意位置插入迭代器。

  • 输入: Container — 容器类型
  • 输出: 插入迭代器对象
  • 注意: 赋值等效于 insert

template <class Container, class Iterator> insert_iterator<Container> inserter(Container& x, Iterator i)

创建插入器。

  • 输入: x — 容器; i — 插入位置
  • 输出: insert_iterator

template <class C> auto begin(C& c) / end(C& c)

非成员 begin/end。

  • 输入: c — 容器/数组
  • 输出: 迭代器
  • 注意: 支持数组和容器

template <class C> auto cbegin(const C& c) / cend(const C& c)

非成员 cbegin/cend。

  • 输入: c — 容器/数组
  • 输出: const_iterator
  • 注意: C++14

template <class C> auto rbegin(C& c) / rend(C& c)

非成员 rbegin/rend。

  • 输入: c — 容器/数组
  • 输出: 反向迭代器
  • 注意: C++14