std::valarray<T>::operator[]
来自 zh.cppreference.net
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 | - | 要返回元素的 slice |
| 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 a2)
&a[i + j] == &a[i] + j
- 这意味着 std::valarray 元素在内存中是连续的。
3)
&a[i] != &b[j] 对于每个对象 a 和 b 且彼此不是别名的
- 这意味着元素中没有别名,并且此属性可用于执行某些类型的优化。
引用在 resize() 或数组销毁时变为无效。
对于重载 (3,5,7,9),该函数可以使用与 std::valarray不同的返回类型实现。在这种情况下,替换类型具有以下属性:
- 所有
const的成员函数 std::valarray 都被提供。 - 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 << "初始 valarray: "; for (int n : data) std::cout << std::setw(3) << n; std::cout << '\n'; data[data > 5] = -1; // valarray<bool> 重载的 operator[] // 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'; }
输出:
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++标准。
| 缺陷报告 | 适用范围 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 389 | C++98 |
重载版本
(1)
的返回类型为
T
|
修正为 const T & |
| LWG 430 | C++98 |
对于重载版本
(3-10) ,若指定无效子集时的行为不明确 |
此情况下的行为
是未定义的 |