Namespaces
Variants

std::valarray<T>::operator[]

От ru.cppreference.net
 
 
 
 
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() равно false , поведение не определено.

(до C++26)

Если pos < size() равно false:

(начиная с C++26)
3-10) Если аргумент не задаёт допустимое подмножество *this , поведение не определено.

Параметры

pos - позиция возвращаемого элемента
slicearr - slice возвращаемых элементов
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]) не имеет 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