std:: input_iterator
| Iterator concepts | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Iterator primitives | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Algorithm concepts and utilities | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Indirect callable concepts | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Common algorithm requirements | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Utilities | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Iterator adaptors | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
定义于头文件
<iterator>
|
||
|
template
<
class
I
>
concept input_iterator
=
|
(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>);
参见
|
(C++20)
|
指定该类型的对象可被递增和解引用
(concept) |
|
(C++20)
|
指定一个
input_iterator
为前向迭代器,支持相等比较和多趟遍历
(concept) |