Spec-Zone.ru › C++

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 - индексы возвращаемых элементов

Возвращаемое значение

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 для неконстантного a
2) &a[i + j] == &a[i] + j
  • Это означает, что элементы std::valarray расположены смежно в памяти.
3) &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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API