std::valarray<T>::operator[]_C++中文网

(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) 到对应元素的引用

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