Namespaces
Variants

std:: input_iterator

From cppreference.net
Iterator library
Iterator concepts
input_iterator
(C++20)

Iterator primitives
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>
template < class I >

concept input_iterator =
std:: input_or_output_iterator < I > &&
std:: indirectly_readable < I > &&
requires { typename /*ITER_CONCEPT*/ < I > ; } &&

std:: derived_from < /*ITER_CONCEPT*/ < I > , std:: input_iterator_tag > ;
(C++20 起)

input_iterator 概念是对 input_or_output_iterator 的细化,增加了对可读取引用值的要求(通过 indirectly_readable )以及要求存在迭代器概念标签。

目录

迭代器概念确定

该概念的定义通过仅用于阐述的别名模板 /*ITER_CONCEPT*/ 进行规范。

为确定 /*ITER_CONCEPT*/ < I > ,令 ITER_TRAITS < I > 表示:当特化 std:: iterator_traits < I > 由主模板生成时取 I ,否则取 std:: iterator_traits < I >

  • ITER_TRAITS < I > :: iterator_concept 有效且命名一个类型,则 /*ITER_CONCEPT*/ < I > 表示该类型。
  • 否则,若 ITER_TRAITS < I > :: iterator_category 有效且命名一个类型,则 /*ITER_CONCEPT*/ < I > 表示该类型。
  • 否则,若 std:: iterator_traits < I > 由主模板生成,则 /*ITER_CONCEPT*/ < I > 表示 std::random_access_iterator_tag
    (即假定 std:: derived_from < /*ITER_CONCEPT*/ < I > , std:: input_iterator_tag > true 。)
  • 否则, /*ITER_CONCEPT*/ < I > 不表示任何类型并导致替换失败。

注释

LegacyInputIterator 要求不同, input_iterator 概念不要求 equality_comparable ,因为输入迭代器通常与哨位进行比较。

示例

最小输入迭代器。

#include <cstddef>
#include <iterator>
class SimpleInputIterator
{
public:
    using difference_type = std::ptrdiff_t;
    using value_type = int;
    int operator*() const;
    SimpleInputIterator& operator++();
    void operator++(int) { ++*this; }
};
static_assert(std::input_iterator<SimpleInputIterator>);

参见

指定该类型的对象可被递增和解引用
(concept)
指定一个 input_iterator 为前向迭代器,支持相等比较和多趟遍历
(concept)