std::valarray<T>::operator[]
來自 cppreference.com
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::valarray 值 a、b 和正確的 std::size_t 值 i、j,所有以下表達式總是評估為 true
1) (a[i] = q, a[i]) == q 對於非 const a
3) &a[i] != &b[j] 對於所有不互為別名的物件 a 和 b
- 這意味著元素中沒有別名,並且此屬性可用於執行某些型別的最佳化。
引用在呼叫 resize()
或陣列被析構時失效。
對於過載 (3,5,7,9),函式可以用不同於 std::valarray 的返回型別實現。在這種情況下,替換型別具有以下屬性
- 提供 std::valarray 的所有 const 成員函式。
- 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 << "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) 如果指定了無效子集 |
在這種情況下,行為是 未定義的 |