命名空间
变体
操作

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.cn
 
 
迭代器库
迭代器概念
迭代器原语
input_iterator_tagoutput_iterator_tagforward_iterator_tagbidirectional_iterator_tagrandom_access_iterator_tagcontiguous_iterator_tag
(C++20)
算法概念与工具
间接可调用概念
常用算法要求
(C++20)
(C++20)
(C++20)
工具
(C++20)
迭代器适配器
范围访问
(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 类型 ItIt::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 不是 旧版迭代器 (LegacyIterator)),并且 std::iterator_traits<It> 未被特化,则假定为 random_access_iterator_tag

无论哪种情况,如果不支持所需的操作,则每个概念都不满足,无论标签是什么。

(C++20 起)

[编辑] 注意

没有单独的 旧版连续迭代器 (LegacyContiguousIterator) 标签。也就是说,无法根据其 iterator_category 来判断是否为 旧版连续迭代器 (LegacyContiguousIterator)要为连续迭代器定义专门的算法,请使用 contiguous_iterator 概念。(C++20 起)

output_iterator_tagoutput_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 中已弃用)
基类,用于简化简单迭代器所需类型的定义
(类模板) [编辑]
提供迭代器属性的统一接口
(类模板) [编辑]
English Deutsch 日本語 中文(简体) 中文(繁體)