名稱空間
變體
操作

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

來自 cppreference.com
< cpp‎ | 數值‎ | 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 - 要返回的元素的 slice
gslicearr - 要返回的元素的 gslice
boolarr - 要返回的元素的 mask
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++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 389 C++98 過載 (1) 的返回型別是 T 更正為 const T&
LWG 430 C++98 對於過載,行為不明確
(3-10) 如果指定了無效子集
在這種情況下,行為是
未定義的