std::input_iterator_tag, std::output_iterator_tag, std::forward_iterator_tag, std::bidirectional_iterator_tag, std::random_access_iterator_tag, std::contiguous_iterator_tag
来自cppreference.com
定义于头文件 <iterator>
|
||
struct input_iterator_tag { }; |
||
struct output_iterator_tag { }; |
||
struct forward_iterator_tag : public input_iterator_tag { }; |
||
struct bidirectional_iterator_tag : public forward_iterator_tag { }; |
||
struct random_access_iterator_tag : public bidirectional_iterator_tag { }; |
||
struct contiguous_iterator_tag: public random_access_iterator_tag { }; |
(C++20 起) | |
定义迭代器的分类。这些标签都是空类型,分别对应五 (C++20 前)六 (C++20 起)种迭代器分类中的一种:
-
input_iterator_tag
对应 遗留输入迭代器 (LegacyInputIterator) 。 -
output_iterator_tag
对应 遗留输出迭代器 (LegacyOutputIterator) 。 -
forward_iterator_tag
对应 遗留向前迭代器 (LegacyForwardIterator) 。 -
bidirectional_iterator_tag
对应 遗留双向迭代器 (LegacyBidirectionalIterator) 。 -
random_access_iterator_tag
对应 遗留随机访问迭代器 (LegacyRandomAccessIterator) 。
|
(C++20 起) |
顾名思义,迭代器分类标签可以用以标示某个迭代器的分类,可以根据这一分类所要求的特性来选择最优算法。
每个迭代器类型 It
都有对应的 std::iterator_traits<It>::iterator_category typedef
,即这五 (C++20 前)六 (C++20 起)种类型之一。
另外,可用 std::iterator_traits<It>::iterator_concept 指示对迭代器概念的遵从。 |
(C++20 起) |
注意 |
(C++17 起) (C++20 前) |
示例
如果需要根据迭代器分类标签选择算法,常用做法是使用分发函数(也可以通过 std::enable_if 实现)
运行此代码
#include <iostream> #include <vector> #include <list> #include <iterator> template< class BDIter > void alg(BDIter, BDIter, std::bidirectional_iterator_tag) { std::cout << "alg() called for bidirectional iterator\n"; } template <class RAIter> void alg(RAIter, RAIter, std::random_access_iterator_tag) { std::cout << "alg() called for random-access iterator\n"; } template< class Iter > void alg(Iter first, Iter last) { alg(first, last, typename std::iterator_traits<Iter>::iterator_category()); } int main() { std::vector<int> v; alg(v.begin(), v.end()); std::list<int> l; alg(l.begin(), l.end()); // std::istreambuf_iterator<char> i1(std::cin), i2; // alg(i1, i2); // 编译错误:无调用的匹配函数 }
输出:
alg() called for random-access iterator alg() called for bidirectional iterator
参阅
(C++17 中弃用) |
用于简化简单的迭代器的必要类型定义的基类 (类模板) |
为迭代器各项性质提供统一接口 (类模板) |