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