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 возвращают классы, содержащие ссылки на элементы массива.
Выбранные элементы(ы) должны существовать:
- для перегрузок (1,2), если
posне меньше, чемsize(), поведение является неопределённым; и - для перегрузок (3-10), если аргумент не указывает допустимый подмножество
*this, поведение является неопределённым.
Параметры
| pos | - | позиция возвращаемого элемента |
| slicearr | - | срез возвращаемых элементов |
| gslicearr | - | gslice возвращаемых элементов |
| boolarr | - | маска возвращаемых элементов |
| indarr | - | индексы возвращаемых элементов |
Возвращаемое значение
std::valarray содержащий копии выбранных элементов.Исключения
Может выбросить исключение, определяемое реализацией.
Примечания
Для правильных значений 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]) не имеет оператора [].
Пример
#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 | Применено к | Поведение, как опубликовано | Корректное поведение |
|---|---|---|---|
| LWG 389 | C++98 | тип возвращаемого значения перегрузки (1) был T | исправлено на const T& |
| LWG 430 | C++98 | поведение было неясным для перегрузок (3-10) если указано недопустимое подмножество | поведение в этом случае неопределено |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/numeric/valarray/operator_at