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 中已弃用)
|
用于简化简单迭代器必需类型定义的基类
(类模板) |
|
为迭代器属性提供统一接口
(类模板) |