std::valarray
来自cppreference.com
| 在标头 <valarray> 定义
|
||
| |
||
std::valarray 是表示并操作值数组的类。它支持对元素逐个进行数学运算,并且支持多种形式的广义下标运算符、切片及间接访问。
模板形参
| T | - | 元素的类型。类型必须满足数值类型 (NumericType) |
成员类型
| 成员类型 | 定义 |
value_type
|
T
|
iterator(C++11)
|
未指定的可变迭代器类型,符合老式随机访问迭代器 (LegacyRandomAccessIterator) 要求及老式连续迭代器 (LegacyContiguousIterator) 要求(C++20 前)并实现 contiguous_iterator(C++20 起),并使得
|
const_iterator(C++11)
|
未指定的常量迭代器类型,符合老式随机访问迭代器 (LegacyRandomAccessIterator) 要求及老式连续迭代器 (LegacyContiguousIterator) 要求(C++20 前)并实现 contiguous_iterator(C++20 起),并使得
|
成员函数
| 构造新的数值数组 (公开成员函数) | |
| 析构数值数组 (公开成员函数) | |
| 为内容赋值 (公开成员函数) | |
| 获取/设置 valarray 数组元素、切片或掩码 (公开成员函数) | |
| 对 valarray 的每个元素运用一元算术运算符 (公开成员函数) | |
| 对 valarray 的每个元素应用复合赋值运算符 (公开成员函数) | |
| 与另一 valarray 交换 (公开成员函数) | |
返回 valarray 的大小 (公开成员函数) | |
| 更改 valarray 的大小 (公开成员函数) | |
| 计算所有元素的和 (公开成员函数) | |
| 返回最小元素 (公开成员函数) | |
| 返回最大的元素 (公开成员函数) | |
| 以填入零的方式移动 valarray 的元素 (公开成员函数) | |
| 循环移动 valarray 的元素 (公开成员函数) | |
对 valarray 的每个元素应用一个函数 (公开成员函数) | |
(C++11) |
获取 valarray 的起始迭代器 (公开成员函数) |
(C++11) |
获取 valarray 的尾后迭代器 (公开成员函数) |
非成员函数
(C++11) |
特化 std::swap 算法 (函数模板) |
| 应用二元运算符到两个 valarray 的每个元素,或一个 valarray 的每个元素和一个值 (函数模板) | |
| 比较两个 valarrays,或比较一个 valarray 和一个值 (函数模板) | |
应用函数 abs 到 valarray 的每个元素 (函数模板) | |
指数函数 | |
| 应用函数 std::exp 到 valarray 的每个元素 (函数模板) | |
| 应用函数 std::log 到 valarray 的每个元素 (函数模板) | |
| 应用函数 std::log10 到 valarray 的每个元素 (函数模板) | |
幂函数 | |
| 应用函数 std::pow 到二个 valarray 或一个 valarray 与一个值 (函数模板) | |
| 应用函数 std::sqrt 到 valarray 的每个元素 (函数模板) | |
三角函数 | |
应用函数 std::sin 到 valarray 的每个元素 (函数模板) | |
| 应用函数 std::cos 到 valarray 的每个元素 (函数模板) | |
| 应用函数 std::tan 到 valarray 的每个元素 (函数模板) | |
| 应用函数 std::asin 到 valarray 的每个元素 (函数模板) | |
| 应用函数 std::acos 到 valarray 的每个元素 (函数模板) | |
| 应用函数 std::atan 到 valarray 的每个元素 (函数模板) | |
| 应用函数 std::atan2 到一个 valarray 和一个值 (函数模板) | |
双曲函数 | |
应用函数 std::sinh 到 valarray 的每个元素 (函数模板) | |
应用函数 std::cosh 到 valarray 的每个元素 (函数模板) | |
| 应用函数 std::tanh 到 valarray 的每个元素 (函数模板) | |
辅助类
| valarray 的 BLAS 式切片:起始下标、长度、跨度 (类) | |
到 valarray 应用切片后的子集的代理 (类模板) | |
| valarray 的通用切片:起始下标、长度集、步幅集 (类) | |
| valarray 应用 gslice 后的子集的代理 (类模板) | |
到应用布尔掩码 operator[] 后的 valarray 子集的代理 (类模板) | |
到应用间接 operator[] 后的 valarray 子集的代理。 (类模板) |
推导指引(C++17 起)
注解
std::valarray 及帮助类定义为免除某些形式的别名使用,从而允许这些类上的操作被优化得类似 C 程序语言中关键词 restrict 的效果。而且,接收 valarray 实参的函数和运算符允许返回代理对象,以使得编译器将诸如 v1 = a * v2 + v3; 的表达式优化成执行 v1[i] = a * v2[i] + v3[i]; 的单个循环,避免任何临时量或多趟运算。然而,表达式模板使得同样的优化技巧对任何 C++ 容器可用,而数值库的主流则因灵活性而偏好表达式模板甚于 valarray。某些 C++ 标准库实现使用表达式模板以实现 std::valarray 上的高效运算(例如 GNU libstdc++ 与 LLVM libc++)。只有少数库进一步优化了 valarray,例如 Intel Integrated Performance Primitives。
| 功能特性测试宏 | 值 | 标准 | 功能特性 |
|---|---|---|---|
__cpp_lib_valarray |
202511L |
(C++26) (DR11) |
std::valarray 的 begin 与 end 成员函数,及 iterator 与 const_iterator 成员类型[1]
|
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| P3016R6 | C++11 | 1) valarray 缺少成员类型 iterator 与 const_iterator2) valarray 有不一致的非成员 begin() 及 end() 函数
|
1) 添加了成员类型 2) 改为成员函数 |
参阅
(C++26) |
数据并行向量类型 (类模板) |
(C++26) |
可以指定宽度的 basic_vec 的便利别名模板 (别名模板) |
(C++26) |
元素类型为 bool 的数据并行类型 (类模板) |
(C++26) |
可以指定宽度的 basic_mask 的便利别名模板 (别名模板) |