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

来自cppreference.com
< cpp‎ | numeric‎ | valarray
 
 
数值库
常用数学函数
数学特殊函数 (C++17)
数学常数 (C++20)
浮点环境 (C++11)
复数
数值数组
伪随机数生成
编译时有理数算术 (C++11)
数值算法
(C++17)
(C++17)
插值
(C++20)
(C++20)
通用数值运算
(C++11)
位操作
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
 
 
(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 的返回类型实现。此情况下,替换类型拥有下列属性:

注意

切片/掩码/间接访问不连锁: 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