Namespaces
Variants

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

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
input_iterator_tag output_iterator_tag forward_iterator_tag bidirectional_iterator_tag random_access_iterator_tag contiguous_iterator_tag
(C++20)
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
定义于头文件 <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 所属的最具体类别。

  1. input_iterator_tag 对应 LegacyInputIterator
  2. output_iterator_tag 对应 LegacyOutputIterator
  3. forward_iterator_tag 对应 LegacyForwardIterator
  4. bidirectional_iterator_tag 对应 LegacyBidirectionalIterator
  5. random_access_iterator_tag 对应 LegacyRandomAccessIterator

迭代器类别标签携带的信息可用于根据类别所暗示的特定需求集选择最高效的算法。

迭代器概念

对于每个 input_iterator 类型 It It :: iterator_concept (若 std:: iterator_traits < It > 由主模板生成)或 std:: iterator_traits < It > :: iterator_concept (若 std:: iterator_traits < It > 被特化)可声明为以下标签之一的别名,以指示 It 意图建模的最强迭代器概念。

  1. input_iterator_tag 对应 input_iterator
  2. forward_iterator_tag 对应 forward_iterator
  3. bidirectional_iterator_tag 对应 bidirectional_iterator
  4. random_access_iterator_tag 对应 random_access_iterator
  5. contiguous_iterator_tag 对应 contiguous_iterator

若未提供 iterator_concept ,则回退使用 iterator_category 。若也未提供 iterator_category (即 It 遗留迭代器 ),且 std:: iterator_traits < It > 未被特化,则假定为 random_access_iterator_tag

无论如何,若所需操作不被支持,则任何概念均不满足,与标签无关。

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