命名空间
变体
操作

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 - 要返回的元素的 gslice
boolarr - 要返回的元素的掩码
indarr - 要返回的元素的索引

[编辑] 返回值

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

[编辑] 异常

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

[编辑] 注意

对于正确的 std::valarrayab 和正确的 std::size_tij,以下所有表达式始终计算为 true

1) (a[i] = q, a[i]) == q 对于非 const a
2) &a[i + j] == &a[i] + j
3) &a[i] != &b[j] 对于任何不是彼此别名的对象 ab
  • 这意味着元素中没有别名,此属性可用于执行某些类型的优化。

在调用 resize() 或数组被析构时,引用将失效。

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

切片/掩码/间接索引访问不会链接:v[v == n][std::slice(0, 5, 2)] = x; 是一个错误,因为 std::mask_arrayv[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 << "Initial valarray:   ";
    for (int n : data)
        std::cout << std::setw(3) << n;
    std::cout << '\n';
 
    data[data > 5] = -1; // valarray<bool> overload of operator[]
    // the type of data > 5 is std::valarray<bool>
    // the type of data[data > 5] is std::mask_array<int>
 
    std::cout << "After v[v > 5] = -1:";
    for (std::size_t n = 0; n < data.size(); ++n) 
        std::cout << std::setw(3) << data[n]; // regular 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++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 389 C++98 重载 (1) 的返回类型为 T 更正为 const T&
LWG 430 C++98 对于重载的行为尚不清楚
(3-10) 如果指定了无效子集
行为是
在这种情况下未定义