# std::valarray<T>::operator[]

< cpp‎ | numeric‎ | valarray

| (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