Namespaces
Variants

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

From 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)

pos < size ( ) false ,则行为未定义。

(C++26 前)

pos < size ( ) false

  • 若实现为 强化实现 ,则发生 契约违反 。此外,若契约违反处理程序在“观察”评估语义下返回,则行为未定义。
  • 若实现非强化实现,则行为未定义。
(C++26 起)
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 对于非常量 a
2) & a [ i + j ] == & a [ i ] + j
3) & a [ i ] ! = & b [ j ] 对于所有非互为别名的对象 a b
  • 这意味着元素间不存在别名关系,该特性可用于实现某些类型的优化。

引用会在 resize() 或数组被销毁时失效。

对于重载 (3,5,7,9) ,该函数的实现可以具有与 std::valarray 不同的返回类型。在这种情况下,替换类型具有以下特性:

切片/掩码/间接索引访问不可链式操作: 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) ,若指定无效子集时的行为不明确
此情况下的行为
是未定义的