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
| 定义于头文件 <iterator> |
||
| struct input_iterator_tag {}; |
(1) | |
| struct output_iterator_tag {}; |
(2) | |
| struct forward_iterator_tag : public input_iterator_tag {}; |
(3) | |
| struct bidirectional_iterator_tag : public forward_iterator_tag {}; |
(4) | |
| struct random_access_iterator_tag : public bidirectional_iterator_tag {}; |
(5) | |
| struct contiguous_iterator_tag : public random_access_iterator_tag {}; |
(6) | (C++20 起) |
定义迭代器的类别。每个标签都是一个空类型。
目录 |
[编辑] 迭代器类别
对于每种 旧版迭代器 (LegacyIterator) 类型 It,必须将 typedef std::iterator_traits<It>::iterator_category 定义为这些标签类型之一的别名,以指示 It 所属的最具体类别。
-
input_iterator_tag对应 旧版输入迭代器 (LegacyInputIterator)。 -
output_iterator_tag对应 旧版输出迭代器 (LegacyOutputIterator)。 -
forward_iterator_tag对应 旧版前向迭代器 (LegacyForwardIterator)。 -
bidirectional_iterator_tag对应 旧版双向迭代器 (LegacyBidirectionalIterator)。 -
random_access_iterator_tag对应 旧版随机访问迭代器 (LegacyRandomAccessIterator)。
迭代器类别标签承载的信息可用于为类别所隐含的特定需求集选择最有效的算法。
迭代器概念对于每个
如果未提供 无论哪种情况,如果不支持所需的操作,则每个概念都不满足,无论标签是什么。 |
(C++20 起) |
[编辑] 注意
没有单独的 旧版连续迭代器 (LegacyContiguousIterator) 标签。也就是说,无法根据其 iterator_category 来判断是否为 旧版连续迭代器 (LegacyContiguousIterator)。要为连续迭代器定义专门的算法,请使用 contiguous_iterator 概念。(C++20 起)
output_iterator_tag 和 output_iterator 概念之间没有对应关系。将 iterator_concept 设置为 output_iterator_tag 仅表示该类型不建模 input_iterator。
[编辑] 示例
根据迭代器类别标签选择算法的常见技术是使用调度函数(另一种方法是 std::enable_if)。迭代器标签类也用于相应的概念定义中,以表示无法仅通过使用模式表达的需求。(C++20 起)
#include <iostream> #include <iterator> #include <list> #include <vector> // Using concepts (tag checking is part of the concepts themselves) template<std::bidirectional_iterator BDIter> void alg(BDIter, BDIter) { std::cout << "1. alg() \t called for bidirectional iterator\n"; } template<std::random_access_iterator RAIter> void alg(RAIter, RAIter) { std::cout << "2. alg() \t called for random-access iterator\n"; } // Legacy, using tag dispatch namespace legacy { // Quite often implementation details are hidden in a dedicated namespace namespace implementation_details { template<class BDIter> void alg(BDIter, BDIter, std::bidirectional_iterator_tag) { std::cout << "3. legacy::alg() called for bidirectional iterator\n"; } template<class RAIter> void alg(RAIter, RAIter, std::random_access_iterator_tag) { std::cout << "4. legacy::alg() called for random-access iterator\n"; } } // namespace implementation_details template<class Iter> void alg(Iter first, Iter last) { implementation_details::alg(first, last, typename std::iterator_traits<Iter>::iterator_category()); } } // namespace legacy int main() { std::list<int> l; alg(l.begin(), l.end()); // 1. legacy::alg(l.begin(), l.end()); // 3. std::vector<int> v; alg(v.begin(), v.end()); // 2. legacy::alg(v.begin(), v.end()); // 4. // std::istreambuf_iterator<char> i1(std::cin), i2; // alg(i1, i2); // compile error: no matching function for call // legacy::alg(i1, i2); // compile error: no matching function for call }
输出
1. alg() called for bidirectional iterator 3. legacy::alg() called for bidirectional iterator 2. alg() called for random-access iterator 4. legacy::alg() called for random-access iterator
[编辑] 参阅
| (C++17 中已弃用) |
基类,用于简化简单迭代器所需类型的定义 (类模板) |
| 提供迭代器属性的统一接口 (类模板) |