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 | - | срез возвращаемых элементов |
| gslicearr | - | обобщённый срез возвращаемых элементов |
| 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. В этом случае тип-замена обладает следующими свойствами:
- Предоставляются все функции-члены
std::valarrayс const. -
std::valarray,std::slice_array,std::gslice_array,std::mask_arrayиstd::indirect_arrayмогут быть сконструированы из типа-замены. - Для каждой функции, принимающей аргумент типа conststd::valarray<T>& за исключением
begin()иend()(начиная с C++11), должны быть добавлены идентичные функции, принимающие типы-замены; - Для каждой функции, принимающей два аргумента типа conststd::valarray<T>&, должны быть добавлены идентичные функции, принимающие все возможные комбинации аргументов типов conststd::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 | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 389 | C++98 | тип возвращаемого значения перегрузки (1) был T | исправлен на constT& |
| LWG 430 | C++98 | поведение для перегрузок (3-10) при указании недопустимого подмножества было неясным | в этом случае поведение не определено |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/valarray/operator_at