std::valarray<T>::operator[]
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 перегрузки возвращают классы, содержащие ссылки на элементы массива.
|
Если |
(до C++26) |
|
Если
|
(начиная с C++26) |
*this , поведение не определено.Параметры
| pos | - | позиция возвращаемого элемента |
| slicearr | - | slice возвращаемых элементов |
| gslicearr | - | gslice возвращаемых элементов |
| boolarr | - | маска возвращаемых элементов |
| indarr | - | индексы возвращаемых элементов |
Возвращаемое значение
Исключения
Может генерировать исключения, определяемые реализацией.
Примечания
Для корректных std::valarray значений a, b и корректных std::size_t значений i, j все следующие выражения всегда вычисляются в true:
(a[i] = q, a[i]) == q для неконстантных a&a[i + j] == &a[i] + j
- Это означает, что std::valarray элементы расположены последовательно в памяти.
&a[i] != &b[j] для каждого объекта a и b, которые не являются псевдонимами друг друга
- Это означает, что в элементах нет псевдонимов, и это свойство может быть использовано для некоторых видов оптимизации.
Ссылки становятся недействительными при resize() или при уничтожении массива.
Для перегрузок (3,5,7,9) функция может быть реализована с типом возврата, отличным от std::valarray. В этом случае замещающий тип имеет следующие свойства:
- Все
constфункции-члены std::valarray предоставлены. - 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++.
| 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 |