std::valarray::operator[]

来自cppreference.com
< 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) 包含到被选择项引用的对应数据结构

[编辑] 异常

(无)

[编辑] 前置条件

被选择元素必须存在。

[编辑] 注意

  • 对于具体的值 ij ,下列属性为 true :
1) (a[i] = q, a[i]) == q
对于非 const 的 a
2) &a[i+j] == &a[i] + j
这表示 valarray 元素在内存中毗邻。
3) &a[i] != &b[j]
这对于每个互不为别称的对象 ab 成立。
这表示元素没有别称,而且此属性可用于进行某些类型的优化。
  • resize 或数组析构时引用变为非法。

对于重载 (3,5,7,9) ,该函数能以异于 std::valarray 的返回类型实现。此情况下,替换类型拥有下列属性:

  • 提供 std::valarray 的所有 const 成员函数。
  • std::valarraystd::slice_arraystd::gslice_arraystd::mask_arraystd::indirect_array 能从替换类型构造。
  • 所有接受类型 const std::valarray& 参数的函数,除了 begin()end() (C++14 起)也应该接受替换类型。
  • 所有接收二个 const std::valarray& 类型参数的函数应该接受任何 const std::valarray& 与替换类型的组合。
  • 返回类型不添加多于超过最深的嵌套参数类型二层的嵌套模板。

[编辑] 注意

切片/掩码/间接访问不连锁: v[v==n][std::slice(0,5,2] = x; 是错误,因为 std::mask_arrayv[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