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) |
Retrieve single elements or portions of the array.
The const overloads that return element sequences create a new std::valarray
object. The non-const overloads return classes holding references to the array elements.
The selected elements(s) must exist:
pos
is not less than size()
, the behavior is undefined; and *this
, the behavior is undefined. pos | - | position of the element to return |
slicearr | - | slice of the elements to return |
gslicearr | - | gslice of the elements to return |
boolarr | - | mask of the elements to return |
indarr | - | indices of the elements to return |
std::valarray
object containing copies of the selected items.May throw implementation-defined exceptions.
For proper std::valarray
values a
, b
and proper std::size_t
values i
, j
, all of the following expressions always evaluate to true
:
(a[i] = q, a[i]) == q
for non-const a
&a[i + j] == &a[i] + j
std::valarray
elements are adjacent in memory.&a[i] != &b[j]
for every objects a
and b
that are not aliases of one another References become invalid on resize()
or when the array is destructed.
For overloads (3,5,7,9), The function can be implemented with the return type different from std::valarray
. In this case, the replacement type has the following properties:
std::valarray
are provided. std::valarray
, std::slice_array
, std::gslice_array
, std::mask_array
and std::indirect_array
can be constructed from the replacement type. begin()
and end()
(since C++11) should also accept the replacement type. Slice/mask/indirect index accesses do not chain: v[v == n][std::slice(0, 5, 2)] = x;
is an error because std::mask_array
(the type of v[v == n]
) does not have operator[].
#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'; }
Output:
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
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 389 | C++98 | the return type of overload (1) was T | corrected to const T& |
LWG 430 | C++98 | the behavior was unclear for overloads (3-10) if an invalid subset is specified | the behavior is undefined in this case |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/numeric/valarray/operator_at