std::ranges::concat_view<Views...>::iterator
来自cppreference.com
<tbody>
</tbody>
template< bool Const > class /*iterator*/ |
(1) | (仅用于阐述*) |
| 辅助概念 |
||
template< bool Const, class... Rs > concept /*concat-is-random-access*/ = /* 见描述 */; |
(2) | (仅用于阐述*) |
template< bool Const, class... Rs > concept /*concat-is-bidirectional*/ = /* 见描述 */; |
(3) | (仅用于阐述*) |
1)
ranges::concat_view<Views...>::iterator 是 ranges::concat_view<Views...> 的 begin() 和 end() 返回的迭代器的类型。2) 设
Fs 为由 Rs 中末尾元素之外的所有元素组成的包。等价于template<bool Const, class... Rs>
concept concat-is-random-access = // 仅用于阐述
all-random-access <Const, Rs...> &&
(ranges::common_range<maybe-const <Const, Fs>> && ...);
。
3) 设
Fs 为由 Rs 中末尾元素之外的所有元素组成的包。等价于template<bool Const, class... Rs>
concept concat-is-bidirectional = // 仅用于阐述
all-bidirectional <Const, Rs...> &&
(ranges::common_range<maybe-const <Const, Fs>> && ...);
。
模板形参
| Const | - | 迭代器是否为常迭代器 |
嵌套类型
仅用于阐述的类型 | |
| 类型 | 定义 |
base-iter
|
std::variant<ranges::iterator_t<maybe-const <Const, Views>>...>(仅用于阐述的成员类型*) |
迭代器属性类型 | |
| 类型 | 定义 |
iterator_concept
|
迭代器标签,见下文 |
iterator_category(有条件提供) |
迭代器标签,见下文 |
value_type
|
concat-value-t <maybe-const <Const, Views>...>
|
difference_type
|
|
确定迭代器概念
iterator_concept 定义如下:
- 如果
concat-is-random-access<Const, Views...>得到实现,那么iterator_concept表示 std::random_access_iterator_tag。 - 否则,如果
concat-is-bidirectional<Const, Views...>得到实现,那么iterator_concept表示 std::bidirectional_iterator_tag。 - 否则,如果
all-forward<Const, Views...>得到实现,那么iterator_concept表示 std::forward_iterator_tag。 - 否则
iterator_concept表示 std::input_iterator_tag。
确定迭代器类别
iterator_category 当且仅当 all-forward <Const, Views...> 得到实现时才有定义。这种情况下它定义如下:
- 如果
std::is_reference_v<concat-reference-t<maybe-const<Const, Views>...>>是false,那么iterator_category表示 std::input_iterator_tag。- 如果 (
std::derived_from<Cs, std::random_access_iterator_tag> && ...) &&concat-is-random-access<Const, Views...>是true,那么iterator_category表示 std::random_access_iterator_tag。 - 否则,如果 (
std::derived_from<Cs, std::bidirectional_iterator_tag> && ...) &&concat-is-bidirectional<Const, Views...>是true,那么iterator_category表示 std::bidirectional_iterator_tag。 - 否则,如果
(std::derived_from<Cs, std::forward_iterator_tag> && ...)是true,那么iterator_category表示 std::forward_iterator_tag。 - 否则
iterator_category表示 std::input_iterator_tag。
- 如果 (
数据成员
| 成员 | 定义 |
maybe-const <Const, ranges::concat_view>* parent_
|
指向父 concat_view 的指针(仅用于阐述的成员对象*) |
base-iter it_
|
指向当前视图中的迭代器 (仅用于阐述的成员对象*) |
成员函数
| 构造迭代器 (公开成员函数) | |
| 访问元素 (公开成员函数) | |
| 按索引访问元素 (公开成员函数) | |
| 推进或减小底层迭代器 (公开成员函数) | |
仅用于阐述的函数模板 | |
如果 it_ 是当前视图的末尾,那么将 it_ 替换为下一个视图的起始 (仅用于阐述的成员函数*) | |
减少 it_,使它指向前一个位置 (仅用于阐述的成员函数*) | |
| 按给定偏移量推进当前位置 (仅用于阐述的成员函数*) | |
| 按给定值减少当前位置 (仅用于阐述的成员函数*) | |
非成员函数
| 比较底层迭代器 (函数) | |
(C++26) |
实施迭代器算术 (函数) |
(C++26) |
将底层迭代器的解引用结果转型为其关联的右值引用类型 (函数) |
(C++26) |
交换两个底层迭代器所指向的对象 (函数) |
示例
基础版本可以在 Compiler Explorer 测试。
运行此代码
#include <iostream>
#include <iterator>
#include <ranges>
int main()
{
namespace views = std::views;
static constexpr int p[]{1, 2, 3};
static constexpr auto e = {4, 5};
auto t = views::iota(6, 9);
auto cat = views::concat(p, e, t);
auto dog = views::concat(cat, cat);
for (auto i{dog.begin()}; i != std::default_sentinel; ++i)
std::cout << *i << ' ';
std::cout << '\n';
}
输出:
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
引用
- C++26 标准(ISO/IEC 14882:2026):
- 26.7.18.3 Class template
concat_view::iterator[range.concat.iterator]
- 26.7.18.3 Class template