Namespaces
Variants

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

来自 zh.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 对于非 const a
2) &a[i + j] == &a[i] + j
  • 这意味着 std::valarray 元素在内存中是连续的。
3) &a[i] != &b[j] 对于每个对象 a 和 b 且彼此不是别名的
  • 这意味着元素中没有别名,并且此属性可用于执行某些类型的优化。

引用在 resize() 或数组销毁时变为无效。

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

  • 所有 const 的成员函数 std::valarray 都被提供。
  • std::valarray,std::slice_array,std::gslice_array,std::mask_array 和 std::indirect_array 可以从替换类型构造。
  • 对于每个接受 const std::valarray<T>& 除了 begin() 和 end()(自C++11起),应当添加接受替换类型的相同函数;
  • 对于每个接受两个 const std::valarray<T>& 参数的函数,应当添加接受 const std::valarray<T>& 和替换类型的每种组合的相同函数。
  • 返回类型的模板嵌套层次不会超过参数类型中最深嵌套的层次两层。

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