std::valarray<T>::operator[]
(1) | ||
T operator[]( std::size_t pos ) const; |
(C++11 前) | |
const T& operator[]( std::size_t pos ) const; |
(C++11 起) | |
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 valarray<bool>& boolarr ) const; |
(7) | |
std::mask_array<T> operator[]( const valarray<bool>& boolarr ); |
(8) | |
std::valarray<T> operator[]( const valarray<std::size_t>& indarr ) const; |
(9) | |
std::indirect_array<T> operator[]( const valarray<std::size_t>& indarr ); |
(10) | |
获取数组的单个元素或一部分。
const 重载返回元素序列,并创建新的 std::valarray 对象。 非 const 重载返回持有到数组元素引用的类。
参数
本节未完成 原因:解释参数 |
返回值
1,2) 到对应元素的引用
3,5,7,9) 含有被选择项副本的 std::valarray 对象
4,6,8,10) 包含到被选择项引用的对应数据结构
异常
(无)
前置条件
被选择元素必须存在。
注意
- 对于具体的值
i
与j
,下列属性为 true :
1) (a[i] = q, a[i]) == q
- 对于非 const 的
a
。
2) &a[i+j] == &a[i] + j
- 这表示 valarray 元素在内存中毗邻。
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& 类型参数的函数,除了 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 <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 << 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 << "After v[v>5]=-1: "; for(std::size_t n = 0; n < data.size(); ++n) std::cout << 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