std::valarray<T>::operator[]
来自cppreference.com
<tbody>
</tbody>
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)
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]) == q2)
&a[i + j] == &a[i] + j
- 这表示 std::valarray 的元素在内存中相邻。
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&和替换类型的每种组合。 - 返回类型添加不多于两层嵌套在最深层嵌套的参数类型上的模板。
- 提供 std::valarray 的所有
切片/掩码/间接索引访问不能连锁: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 << "初始 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) 指定无效子集时的行为不明确 | 此时行为未定义 |