std::contiguous_iterator
在标头 <iterator> 定义
|
||
template< class I > concept contiguous_iterator = |
(C++20 起) | |
contiguous_iterator
概念精化了 random_access_iterator
,提供其所代表的元素在内存中连续存储的保证。
迭代器概念确定
此概念的定义通过仅用于阐释的别名模板 /*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。
- 否则 /*ITER_CONCEPT*/<I> 不代表类型并导致替换失败。
语义要求
令 a
与 b
为 I
类型的可解引用迭代器,c
为 I
类型的不可解引用迭代器,使得 b
从 a
可及且 c
从 b
可及。仅当 contiguous_iterator
所蕴含的所有概念均被类型 I
所实现,且满足以下条件时,它被实现:
- std::to_address(a) == std::addressof(*a),
- std::to_address(b) == std::to_address(a) + std::iter_difference_t<I>(b - a),并且
- std::to_address(c) == std::to_address(a) + std::iter_difference_t<I>(c - a)。
相等性保持
标准库概念的 requires 表达式中声明的表达式都要求保持相等性(除非另外说明)。
隐式表达式变种
使用了不修改某常量左值操作数的表达式的 requires 表达式,也会要求其隐式的表达式变种。
注解
每个指向完整对象类型的指针类型都实现 contiguous_iterator
。
标准库中,在 C++17 中被要求满足老式连续迭代器 (LegacyContiguousIterator) 的要求的迭代器类型,亦在 C++20 中被要求实现 contiguous_iterator
。
参阅
(C++20) |
指定 bidirectional_iterator 为随机访问迭代器,支持常数时间内的前进和下标访问 (概念) |