std::ranges:: views:: concat, std::ranges:: concat_view
|
定义于头文件
<ranges>
|
||
|
template
<
ranges::
input_range
...
Views
>
requires
(
ranges::
view
<
Views
>
&&
...
)
&&
(
sizeof...
(
Views
)
>
0
)
&&
|
(1) | (C++26 起) |
|
namespace
views
{
inline
constexpr
/* 未指定 */
concat
=
/* 未指定 */
;
|
(2) | (C++26 起) |
|
调用签名
|
||
|
template
<
ranges::
viewable_range
...
Rs
>
requires
/* 见下文 */
|
(C++26 起) | |
|
辅助类型别名
|
||
|
template
<
class
...
Rs
>
using
/*concat-reference-t*/
=
|
(3) | ( 仅用于说明* ) |
|
template
<
class
...
Rs
>
using /*concat-value-t*/ = std:: common_type_t < ranges:: range_value_t < Rs > ... > ; |
(4) | ( 仅用于说明* ) |
|
template
<
class
...
Rs
>
using
/*concat-rvalue-reference-t*/
=
|
(5) | ( 仅用于说明* ) |
|
辅助概念
|
||
|
template
<
class
Ref,
class
RRef,
class
It
>
concept /*concat-indirectly-readable-impl*/ = /* 见描述 */ ; |
(6) | ( 仅用于说明* ) |
|
template
<
class
...
Rs
>
concept /*concatable*/ = /* 见描述 */ ; |
(7) | ( 仅用于说明* ) |
concat_view
提供了一种
view
工厂,该工厂接受任意数量的范围作为参数列表,并生成一个视图。该视图从第一个范围的第一个元素开始,到最后一个范围的最后一个元素结束,中间按参数顺序依次包含所有范围的元素,实际上相当于将参数范围进行串联或链式拼接。
views::concat
是一个定制点对象。
给定一组子表达式 exprs ,表达式 views :: concat ( exprs... ) 在 表达式等价 于:
-
views::
all
(
exprs...
)
(当
exprs
是仅包含单个元素的包且其类型满足
input_range概念时), - 否则为 concat_view ( exprs... ) 。
iter_move
情形的右值引用。
template< class... Rs > concept /*concat-indirectly-readable*/ = // 仅用于说明 std::common_reference_with</*concat-reference-t*/<Rs...>&&, /*concat-value-t*/<Rs...>&> && std::common_reference_with</*concat-reference-t*/<Rs...>&&, /*concat-rvalue-reference-t*/<Rs...>&&> && std::common_reference_with</*concat-rvalue-reference-t*/<Rs...>&&, /*concat-value-t*/<Rs...> const&> && (/*concat-indirectly-readable-impl*/</*concat-reference-t*/<Rs...>, /*concat-rvalue-reference-t*/<Rs...>, ranges::iterator_t<Rs>> && ...);
template< class Ref, class RRef, class It > concept /*concat-indirectly-readable-impl*/ = // 仅用于说明 requires(const It it) { { *it } -> std::convertible_to<Ref>; { ranges::iter_move(it)} -> std::convertible_to<RRef>; };
template< class... Rs > concept /*concatable*/ = requires { // 仅用于说明 typename /*concat-reference-t*/<Rs...>; typename /*concat-value-t*/<Rs...>; typename /*concat-rvalue-reference-t*/<Rs...>; } && /*concat-indirectly-readable*/<Rs...>;
concat_view
始终满足
input_range
概念要求,并且当每个被适配的
view
类型满足相应概念时,该视图还会满足
forward_range
、
bidirectional_range
、
random_access_range
或
sized_range
概念要求。
concat_view
可以是
common_range
,当且仅当最后一个底层范围满足
common_range
概念。
目录 |
定制点对象
名称
views::concat
表示一个
定制点对象
,这是一个字面量
semiregular
类类型的常量
函数对象
。有关详细信息,请参阅
定制点对象
。
数据成员
| 成员 | 描述 |
std::
tuple
<
Views...
>
views_
|
所有适配的视图对象
( 仅用于说明的成员对象* ) |
成员函数
构造一个
concat_view
(公开成员函数) |
|
|
返回指向起始位置的迭代器
(公开成员函数) |
|
|
返回指向末尾位置的迭代器或哨兵
(公开成员函数) |
|
返回元素数量,仅当底层(适配的)范围满足
sized_range
时提供
(公开成员函数) |
|
继承自 std::ranges::view_interface |
|
返回派生视图是否为空,仅当它满足
sized_range
或
forward_range
时提供
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
|
(C++23)
|
返回指向范围起始的常量迭代器
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
(C++23)
|
返回范围常量迭代器的哨兵
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
返回派生视图是否非空,仅当
ranges::empty
适用于它时提供
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
返回派生视图中的首个元素,仅当它满足
forward_range
时提供
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
返回派生视图中的最后一个元素,仅当它满足
bidirectional_range
和
common_range
时提供
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
返回派生视图中的第
n
个元素,仅当它满足
random_access_range
时提供
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
推导指引
嵌套类
| 类名 | 定义 |
|
迭代器类型
( 仅用于说明的成员类模板* ) |
辅助模板
不存在对
concat_view
的
ranges::
enable_borrowed_range
特化,因为这需要迭代器实现始终包含所有底层范围的全部迭代器和哨位副本。
注释
无参数的
views
::
concat
(
)
是病式构造,因为无法合理确定元素类型
T
。单参数
views
::
concat
(
r
)
在表达式上等价于
views::
all
(
r
)
。
| 功能测试 宏 | 值 | 标准 | 功能 |
|---|---|---|---|
__cpp_lib_ranges_concat
|
202403L
|
(C++26) |
std::ranges::concat_view
|
示例
初步版本可在 Compiler Explorer 上查看。
#include <cassert> #include <list> #include <print> #include <ranges> #include <vector> int main() { std::vector<int> v0{1, 2, 3}, v1{4, 5}; int a[]{6, 7}; int i{8}; auto ie{std::views::single(i)}; auto con = std::views::concat(v0, v1, a, ie); assert(con.size() == v0.size() + v1.size() + std::size(a) + ie.size()); std::println("con.size(): {}", con.size()); std::println("con: {}", con); con[6] = 42; // con is random_access_range, operator[] returns a reference assert(a[1] == 42); // a[1] was modified via con[6] std::println("con: {}", con); std::list<int> l{7, 8}; // list is bidirectional range auto cat = std::views::concat(v0, l); std::println("cat: {}", cat); // cat[0] = 13; // compile-time error: cat is bidirectional => no operator[] }
输出:
con.size(): 8 con: [1, 2, 3, 4, 5, 6, 7, 8] con: [1, 2, 3, 4, 5, 6, 42, 8] cat: [1, 2, 3, 7, 8]
参考文献
- C++26 标准 (ISO/IEC 14882:2026):
-
- 26.7.18 拼接视图 [range.concat]
参见
|
(C++20)
|
由展平
view
的
range
s
序列组成的
view
(类模板) (范围适配器对象) |
由展平范围视图序列组成的
view
,元素间包含分隔符
(类模板) (范围适配器对象) |
|
|
(C++23)
|
由对应适配视图元素的引用元组组成的
view
(类模板) (定制点对象) |
由适配视图的n元笛卡尔积计算结果元组组成的
view
(类模板) (定制点对象) |