std::ranges:: size
|
定义于头文件
<ranges>
|
||
|
定义于头文件
<iterator>
|
||
|
inline
namespace
/* 未指定 */
{
inline
constexpr
auto
size
=
/* 未指定 */
;
|
(C++20 起)
(定制点对象) |
|
|
调用签名
|
||
|
template
<
class
T
>
requires
/* 见下文 */
|
(C++20 起) | |
在常数时间内计算 t 中的元素数量。
给定其
t
表示(可能经过
物化
的)结果对象的
子表达式
为
E
,且
E
的类型为
T
:
-
若
T是未知边界的数组, ranges :: size ( E ) 为病式表达式。 -
否则,若
T是数组类型, ranges :: size ( E ) 表达式等价于 decay-copy ( std:: extent_v < T > ) (C++23 前) auto ( std:: extent_v < T > ) (C++23 起) 。 -
否则,若满足以下所有条件,
ranges
::
size
(
E
)
表达式等价于
decay-copy
(
t.
size
(
)
)
(C++23 前)
auto
(
t.
size
(
)
)
(C++23 起)
:
- ranges:: disable_sized_range < std:: remove_cv_t < T >> 为 false 。
- decay-copy ( t. size ( ) ) (C++23 前) auto ( t. size ( ) ) (C++23 起) 是合法表达式且其类型为 整数类似类型 。
-
否则,若满足以下所有条件,
ranges
::
size
(
E
)
表达式等价于
decay-copy
(
size
(
t
)
)
(C++23 前)
auto
(
size
(
t
)
)
(C++23 起)
:
-
T是类或枚举类型。 - ranges:: disable_sized_range < std:: remove_cv_t < T >> 为 false 。
-
decay-copy
(
size
(
t
)
)
(C++23 前)
auto
(
size
(
t
)
)
(C++23 起)
是合法表达式且其类型为整数类似类型,其中
size的含义通过仅执行 实参依赖查找 确定。
-
-
否则,若满足以下所有条件,
ranges
::
size
(
E
)
表达式等价于
to-unsigned-like ( ranges:: end ( t ) - ranges:: begin ( t ) ) :-
T满足forward_range概念。 -
令
ranges::
begin
(
t
)
的类型为
I, ranges:: end ( t ) 的类型为S,同时满足sized_sentinel_for< S, I > 与forward_iterator< I > 概念。 -
to-unsigned-like ( ranges:: end ( t ) - ranges:: begin ( t ) ) 是合法表达式。
-
- 否则, ranges :: size ( E ) 为病式表达式。
当 ranges :: size ( E ) 出现在模板实例化的直接上下文中时,上述可诊断的格式错误情况会导致 替换失败 。
目录 |
定制点对象
名称
ranges::size
表示一个
定制点对象
,它是一个字面量
semiregular
类类型的常量
函数对象
。详细信息请参阅
定制点对象
。
注释
当表达式 e 满足 ranges :: size ( e ) 有效时,其返回类型为 类整数类型 。
C++20 标准要求:若底层
size
函数调用返回纯右值,则返回值应当从实质化的临时对象进行移动构造。但所有现有实现均直接返回该纯右值。该要求已通过后 C++20 提案
P0849R8
修正以与现有实现保持一致。
表达式 ranges:: distance ( e ) 也可用于确定范围 e 的大小。与 ranges :: size ( e ) 不同, ranges:: distance ( e ) 即使当 e 是无大小范围时仍可工作,代价是在这种情况下具有线性时间复杂度。
示例
#include <iostream> #include <ranges> #include <type_traits> #include <vector> int main() { auto v = std::vector<int>{}; std::cout << "ranges::size(v) == " << std::ranges::size(v) << '\n'; auto il = {7}; // std::initializer_list std::cout << "ranges::size(il) == " << std::ranges::size(il) << '\n'; int array[]{4, 5}; // array has a known bound std::cout << "ranges::size(array) == " << std::ranges::size(array) << '\n'; static_assert(std::is_signed_v<decltype(std::ranges::size(v))> == false); }
输出:
ranges::size(v) == 0 ranges::size(il) == 1 ranges::size(array) == 2
缺陷报告
下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
| DR | 适用范围 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| P2602R2 | C++20 |
存在通过
ADL
查找特定非成员
size
的机制
|
移除了该机制 |
参见
|
(C++20)
|
返回等于范围大小的有符号整数
(定制点对象) |
|
(C++20)
|
指定范围能在常数时间内获知其大小
(概念) |
|
(C++20)
|
返回迭代器与哨位之间,或范围起始与末尾之间的距离
(算法函数对象) |
|
(C++17)
(C++20)
|
返回容器或数组的大小
(函数模板) |