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

来自cppreference.com
< cpp‎ | numeric‎ | valarray
 
 
 
 
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),如果 pos 不小于 size(),那么行为未定义。
  • 对于重载 (3-10),如果实参指定的不是 *this 的有效子集,那么行为未定义。

参数

pos - 要返回的(单个)元素的位置
slicearr - 要返回的(单个或多个)元素的切片
gslicearr - 要返回的(单个或多个)元素的通用切片
boolarr - 要返回的(单个或多个)元素的掩码
indarr - 要返回的(单个或多个)元素的索引

返回值

1,2) 到对应元素的引用
3,5,7,9) 含有被选择项副本的 std::valarray 对象
4,6,8,10) 包含到被选择项引用的对应数据结构

异常

可能会抛出由实现定义的异常。

注解

对于适当的 std::valarrayab 和适当的 std::size_tij,以下所有表达式始终会求值为 true

1) 对于非 const 的 a(a[i] = q, a[i]) == q
2) &a[i + j] == &a[i] + j
3) 对于每对不是另一方的别名的对象 ab&a[i] != &b[j]
  • 这表示元素中不存在别名,此特性可以用来进行某些优化。

调用 resize() 或者析构数组会导致引用失效。

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

切片/掩码/间接索引访问不能连锁:v[v == n][std::slice(0, 5, 2)] = x; 是错误的,因为 std::mask_arrayv[v == n] 的类型)没有 operator[]

示例

#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) 指定无效子集时的行为不明确 此时行为未定义