CppDS.com

C++ 98 11 14 17 20 手册

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
< cpp‎ | iterator
 
 
迭代器库
迭代器概念
迭代器原语
input_iterator_tagoutput_iterator_tagforward_iterator_tagbidirectional_iterator_tagrandom_access_iterator_tagcontiguous_iterator_tag
(C++20)
(C++17 中弃用)
算法概念与工具
间接可调用概念
常用算法要求
工具
迭代器适配器
流迭代器
迭代器定制点
迭代器操作
(C++11)
(C++11)
范围访问
(C++11)(C++14)
(C++11)(C++14)
(C++17)(C++20)
(C++14)(C++14)
(C++14)(C++14)
(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 起)

定义迭代器的分类。这些标签都是空类型,分别对应 (C++20 前) (C++20 起)种迭代器分类中的一种:

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)
6) contiguous_iterator_tag 对应遗留连续迭代器 (LegacyContiguousIterator)

顾名思义,迭代器分类标签可以用以标示某个迭代器的分类,可以根据这一分类所要求的特性来选择最优算法。

每个迭代器类型 It 都有对应的 std::iterator_traits<It>::iterator_category typedef ,即这 (C++20 前) (C++20 起)种类型之一。

另外,可用 std::iterator_traits<It>::iterator_concept 指示对迭代器概念的遵从(只要该迭代器亦满足盖面中声明的其他要求)。

(C++20 起)

注解

遗留连续迭代器 (LegacyContiguousIterator) 无分离的标签。

(C++17 起)
(C++20 前)

示例

如果需要根据迭代器分类标签选择算法,常用做法是使用分发函数(也可以通过 std::enable_if 实现)

#include <iostream>
#include <vector>
#include <list>
#include <iterator>
 
// 经常把实现细节隐藏于细致的命名空间
namespace implementation_details {
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";
}
} // namespace implementation_details
 
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 中弃用)
用于简化简单的迭代器的必要类型定义的基类
(类模板)
为迭代器各项性质提供统一接口
(类模板)
关闭