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 | - | 要返回的(单个或多个)元素的通用切片 |
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) 对于非 const 的 a,(a[i] = q, a[i]) == q
3) 对于每对不是另一方的别名的对象 a 和 b,&a[i] != &b[j]
- 这表示元素中不存在别名,此特性可以用来进行某些优化。
调用 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& 类型参数的函数,除了 begin() 和 end() (C++11 起)也应该接受替换类型。
- 所有接受两个 const std::valarray& 类型参数的函数都应该接受 const std::valarray& 和替换类型的每种组合。
- 返回类型添加不多于两层嵌套在最深层嵌套的参数类型上的模板。
切片/掩码/间接索引访问不能连锁:v[v == n][std::slice(0, 5, 2)] = x; 是错误的,因为 std::mask_array(v[v == n] 的类型)没有 operator[]。
示例
运行此代码
#include <iomanip> #include <iostream> #include <valarray> int main() { std::valarray<int> data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; std::cout << "初始 valarray: "; for (int n : data) std::cout << std::setw(3) << n; std::cout << '\n'; data[data > 5] = -1; // operator[] 的 valarray<bool> 重载 // data > 5 的类型是 std::valarray<bool> // data[data > 5] 的类型是 std::mask_array<int> std::cout << "在 v[v > 5] = -1 后:"; for (std::size_t n = 0; n < data.size(); ++n) std::cout << std::setw(3) << data[n]; // 常规 operator[] std::cout << '\n'; }
输出:
初始 valarray: 0 1 2 3 4 5 6 7 8 9 在 v[v > 5] = -1 后:0 1 2 3 4 5 -1 -1 -1 -1
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 389 | C++98 | 重载 (1) 的返回类型是 T
|
改成 const T& |
LWG 430 | C++98 | 重载 (3-10) 指定无效子集时的行为不明确 | 此时行为未定义 |