std::valarray<T>::operator[]
来自 cppreference.com
const T& operator[]( std::size_t pos ) const; |
(1) | |
T& operator[]( std::size_t pos ); |
(2) | |
std::valarray<T> operator[]( std::slice slicearr ) const; |
(3) | |
std::slice_array<T> operator[]( std::slice slicearr ); |
(4) | |
std::valarray<T> operator[]( const std::gslice& gslicearr ) const; |
(5) | |
std::gslice_array<T> operator[]( const std::gslice& gslicearr ); |
(6) | |
std::valarray<T> operator[]( const std::valarray<bool>& boolarr ) const; |
(7) | |
std::mask_array<T> operator[]( const std::valarray<bool>& boolarr ); |
(8) | |
std::valarray<T> operator[]( const std::valarray<std::size_t>& indarr ) const; |
(9) | |
std::indirect_array<T> operator[]( const std::valarray<std::size_t>& indarr ); |
(10) | |
检索单个元素或数组的部分。
返回元素序列的 const 重载创建一个新的 std::valarray 对象。非 const 重载返回包含对数组元素引用的类。
所选元素必须存在
- 对于重载 (1,2),如果 pos 不小于
size()
,则行为未定义;以及 - 对于重载 (3-10),如果参数未指定 *this 的有效子集,则行为未定义。
内容 |
[编辑] 参数
pos | - | 要返回的元素的位置 |
slicearr | - | 要返回的元素的 切片 |
gslicearr | - | 要返回的元素的 gslice |
boolarr | - | 要返回的元素的掩码 |
indarr | - | 要返回的元素的索引 |
[编辑] 返回值
1,2) 对相应元素的引用。
3,5,7,9) 包含所选项目的副本的 std::valarray 对象。
4,6,8,10) 包含对所选项目的引用的相应数据结构。
[编辑] 异常
可能会抛出实现定义的异常。
[编辑] 注意
对于正确的 std::valarray 值 a、b 和正确的 std::size_t 值 i、j,以下所有表达式始终计算为 true
1) (a[i] = q, a[i]) == q 对于非 const a
3) &a[i] != &b[j] 对于任何不是彼此别名的对象 a 和 b
- 这意味着元素中没有别名,此属性可用于执行某些类型的优化。
在调用 resize()
或数组被析构时,引用将失效。
对于重载 (3,5,7,9),函数可以使用与 std::valarray 不同的返回类型实现。在这种情况下,替代类型具有以下属性
- 提供了 std::valarray 的所有 const 成员函数。
- std::valarray、std::slice_array、std::gslice_array、std::mask_array 和 std::indirect_array 可以从替代类型构造。
- 对于每个接受 const std::valarray<T>& 的函数 除 begin() 和 end()(自 C++11 起),将添加接受替代类型的相同函数;
- 对于每个接受两个 const std::valarray<T>& 参数的函数,将添加接受 const std::valarray<T>& 和替代类型的每种组合的相同函数。
- 返回类型不会在最深层的嵌套参数类型上添加超过两层的模板嵌套。
切片/掩码/间接索引访问不会链接:v[v == n][std::slice(0, 5, 2)] = x; 是一个错误,因为 std::mask_array(v[v == n] 的类型)没有 operator[].
[编辑] 示例
运行此代码
#include <cstddef> #include <iomanip> #include <iostream> #include <valarray> int main() { std::valarray<int> data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; std::cout << "Initial valarray: "; for (int n : data) std::cout << std::setw(3) << n; std::cout << '\n'; data[data > 5] = -1; // valarray<bool> overload of operator[] // the type of data > 5 is std::valarray<bool> // the type of data[data > 5] is std::mask_array<int> std::cout << "After v[v > 5] = -1:"; for (std::size_t n = 0; n < data.size(); ++n) std::cout << std::setw(3) << data[n]; // regular operator[] std::cout << '\n'; }
输出
Initial valarray: 0 1 2 3 4 5 6 7 8 9 After v[v > 5] = -1: 0 1 2 3 4 5 -1 -1 -1 -1
[编辑] 缺陷报告
以下行为改变缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 389 | C++98 | 重载 (1) 的返回类型为 T |
更正为 const T& |
LWG 430 | C++98 | 对于重载的行为尚不清楚 (3-10) 如果指定了无效子集 |
行为是 在这种情况下未定义 |