29 Numerics library [numerics]

29.7 Numeric arrays [numarray]

29.7.2 Class template valarray [template.valarray]

29.7.2.1 Class template valarray overview [template.valarray.overview]

namespace std {
  template<class T> class valarray {
  public:
    using value_type = T;

    // [valarray.cons], construct/destroy
    valarray();
    explicit valarray(size_t);
    valarray(const T&, size_t);
    valarray(const T*, size_t);
    valarray(const valarray&);
    valarray(valarray&&) noexcept;
    valarray(const slice_array<T>&);
    valarray(const gslice_array<T>&);
    valarray(const mask_array<T>&);
    valarray(const indirect_array<T>&);
    valarray(initializer_list<T>);
    ~valarray();

    // [valarray.assign], assignment
    valarray& operator=(const valarray&);
    valarray& operator=(valarray&&) noexcept;
    valarray& operator=(initializer_list<T>);
    valarray& operator=(const T&);
    valarray& operator=(const slice_array<T>&);
    valarray& operator=(const gslice_array<T>&);
    valarray& operator=(const mask_array<T>&);
    valarray& operator=(const indirect_array<T>&);

    // [valarray.access], element access
    const T&          operator[](size_t) const;
    T&                operator[](size_t);

    // [valarray.sub], subset operations
    valarray          operator[](slice) const;
    slice_array<T>    operator[](slice);
    valarray          operator[](const gslice&) const;
    gslice_array<T>   operator[](const gslice&);
    valarray          operator[](const valarray<bool>&) const;
    mask_array<T>     operator[](const valarray<bool>&);
    valarray          operator[](const valarray<size_t>&) const;
    indirect_array<T> operator[](const valarray<size_t>&);

    // [valarray.unary], unary operators
    valarray operator+() const;
    valarray operator-() const;
    valarray operator~() const;
    valarray<bool> operator!() const;

    // [valarray.cassign], compound assignment
    valarray& operator*= (const T&);
    valarray& operator/= (const T&);
    valarray& operator%= (const T&);
    valarray& operator+= (const T&);
    valarray& operator-= (const T&);
    valarray& operator^= (const T&);
    valarray& operator&= (const T&);
    valarray& operator|= (const T&);
    valarray& operator<<=(const T&);
    valarray& operator>>=(const T&);

    valarray& operator*= (const valarray&);
    valarray& operator/= (const valarray&);
    valarray& operator%= (const valarray&);
    valarray& operator+= (const valarray&);
    valarray& operator-= (const valarray&);
    valarray& operator^= (const valarray&);
    valarray& operator|= (const valarray&);
    valarray& operator&= (const valarray&);
    valarray& operator<<=(const valarray&);
    valarray& operator>>=(const valarray&);

    // [valarray.members], member functions
    void swap(valarray&) noexcept;

    size_t size() const;

    T sum() const;
    T min() const;
    T max() const;

    valarray shift (int) const;
    valarray cshift(int) const;
    valarray apply(T func(T)) const;
    valarray apply(T func(const T&)) const;
    void resize(size_t sz, T c = T());
  };

  template<class T, size_t cnt> valarray(const T(&)[cnt], size_t) -> valarray<T>;
}

Шаблон класса valarray<T> представляет собой одномерный интеллектуальный массив, элементы которого нумеруются последовательно с нуля. Это представление математической концепции упорядоченного набора значений. Для удобства объект типаvalarray<T> в остальной части называется «массивом»[numarray]. Иллюзия более высокой размерности может быть создана знакомой идиомой вычисляемых индексов вместе с мощными возможностями подмножества, обеспечиваемыми операторами обобщенных индексов.276

Реализации разрешено квалифицировать любую из функций, объявленных <valarray> как inline.

Намерение состоит в том, чтобы указать шаблон массива, который имеет минимальную функциональность, необходимую для устранения неоднозначности псевдонимов и увеличения количества временных файлов. Таким образом, valarray шаблон не является ни классом матрицы, ни классом поля. Однако это очень полезный строительный блок для разработки таких классов.

29.7.2.2 valarray constructors [valarray.cons]

valarray();

Effects: Создает объектvalarray нулевой длины.277

explicit valarray(size_t n);

Effects: Создает avalarray , имеющий длинуn. Каждый элемент массива равен value-initialized.

valarray(const T& v, size_t n);

Effects: Создает avalarray , имеющий длинуn. Каждый элемент массива инициализируется с помощьюv.

valarray(const T* p, size_t n);

Requires: p указывает на array ([dcl.array]) как минимум из n элементов.

Effects: Создает avalarray , имеющий длинуn. Значения элементов массива инициализируются первыми n значениями, на которые указывает первый аргумент.278

valarray(const valarray& v);

Effects: Создает avalarray , имеющий ту же длину, что иv. Элементы инициализируются значениями соответствующих элементовv.279

valarray(valarray&& v) noexcept;

Effects: Создает avalarray , имеющий ту же длину, что иv. Элементы инициализируются значениями соответствующих элементовv.

Complexity: Постоянный.

valarray(initializer_list<T> il);

Effects: Эквивалентноvalarray(il.begin(), il.size()).

valarray(const slice_array<T>&); valarray(const gslice_array<T>&); valarray(const mask_array<T>&); valarray(const indirect_array<T>&);

Эти конструкторы преобразования преобразуют один из четырех эталонных шаблонов в файл valarray.

~valarray();

Effects: Деструктор применяется к каждому элементу *this; реализация может вернуть всю выделенную память.

Этот конструктор по умолчанию важен, посколькуvalarray могут быть полезны массивы . После инициализации длину пустого массива можно увеличить с помощью resize функции-члена.

Этот конструктор является предпочтительным методом преобразования массива C в valarray объект.

Этот конструктор копирования создает отдельный массив, а не псевдоним. Реализации, в которых массивы совместно используют хранилище, разрешены, но они должны реализовывать механизм копирования по ссылке, чтобы гарантировать, что массивы концептуально различны.

29.7.2.3 valarray assignment [valarray.assign]

valarray& operator=(const valarray& v);

Effects: Каждому элементу *this массива присваивается значение соответствующего элементаv. Если длинаv не равна длине , перед выполнением присваивания*thisизменяется размер ,*this чтобы сделать два массива одинаковой длины, как при вызовеresize(v.size()).

Postconditions:size() == v.size().

Returns:*this.

valarray& operator=(valarray&& v) noexcept;

Effects:*this получает значениеv. Значениеv после присваивания не указано.

Returns:*this.

Complexity: Линейный.

valarray& operator=(initializer_list<T> il);

Effects: Эквивалентен:return *this = valarray(il);

valarray& operator=(const T& v);

Effects: Присваиваетсяv каждому элементу*this.

Returns:*this.

valarray& operator=(const slice_array<T>&); valarray& operator=(const gslice_array<T>&); valarray& operator=(const mask_array<T>&); valarray& operator=(const indirect_array<T>&);

Requires: Длина массива, на который ссылается аргумент, равнаsize(). Значение элемента в левой частиvalarray оператора присваивания не зависит от значения другого элемента в этой левой части.

Эти операторы позволяют назначать результаты обобщенной операции индексации непосредственно объекту valarray.

29.7.2.4 valarray element access [valarray.access]

const T& operator[](size_t n) const; T& operator[](size_t n);

Requires: n < size().

Returns: Ссылка на соответствующий элемент массива. [ Note: Выражение(a[i] = q, a[i]) == q оцениваетсяtrue как любое непостоянноеvalarray<T> a, любоеT qилиsize_­t i такое, что значениеi меньше длиныa. ]end note

Remarks: Выражение&a[i+j] == &a[i] + j оцениваетсяtrue для всехsize_­t i иsize_­t j таких, чтоi+j < a.size().

Выражение&a[i] != &b[j] принимает значениеtrue для любых двух массивов ,a аb и для любого size_­t i иsize_­t j таким образом, чтоi < a.size() иj < b.size(). [ Note: Это свойство указывает на отсутствие псевдонимов и может быть использовано для оптимизации компиляторов. Компиляторы могут использовать встраивание, распространение констант, слияние циклов, отслеживание указателей, полученных из operator new, и другие методы для генерации эффективных valarrays. ]end note

Ссылка, возвращаемая оператором индекса для массива, должна быть действительной до тех пор, пока для этого массива не будетresize(size_­t, T) вызвана функция-член или пока не закончится время жизни этого массива, в зависимости от того, что произойдет раньше.

29.7.2.5 valarray subset operations [valarray.sub]

Членoperator[] перегружен, чтобы предоставить несколько способов выбора последовательностей элементов из тех, которые контролируются*this. Каждая из этих операций возвращает подмножество массива. Версии с квалификацией const возвращают это подмножество как новыйvalarray объект. Неконстантные версии возвращают объект шаблона класса, который имеет ссылочную семантику на исходный массив, работая в сочетании с различными перегрузкамиoperator= и другими операторами присваивания, чтобы обеспечить выборочную замену (нарезку) контролируемой последовательности. В каждом случае выбранные элементы должны существовать.

valarray operator[](slice slicearr) const;

Returns: A,valarray содержащий те элементы управляемой последовательности, которые обозначеныslicearr. [Example:

const valarray<char> v0("abcdefghijklmnop", 16);
// v0[slice(2, 5, 3)] returns valarray<char>("cfilo", 5)

end example]

slice_array<T> operator[](slice slicearr);

Returns: Объект, содержащий ссылки на элементы контролируемой последовательности, выбранные с помощьюslicearr. [Example:

valarray<char> v0("abcdefghijklmnop", 16);
valarray<char> v1("ABCDE", 5);
v0[slice(2, 5, 3)] = v1;
// v0 == valarray<char>("abAdeBghCjkDmnEp", 16);

end example]

valarray operator[](const gslice& gslicearr) const;

Returns: A,valarray содержащий те элементы управляемой последовательности, которые обозначеныgslicearr. [Example:

const valarray<char> v0("abcdefghijklmnop", 16);
const size_t lv[] = { 2, 3 };
const size_t dv[] = { 7, 2 };
const valarray<size_t> len(lv, 2), str(dv, 2);
// v0[gslice(3, len, str)] returns
// valarray<char>("dfhkmo", 6)

end example]

gslice_array<T> operator[](const gslice& gslicearr);

Returns: Объект, содержащий ссылки на элементы контролируемой последовательности, выбранные с помощьюgslicearr. [Example:

valarray<char> v0("abcdefghijklmnop", 16);
valarray<char> v1("ABCDEF", 6);
const size_t lv[] = { 2, 3 };
const size_t dv[] = { 7, 2 };
const valarray<size_t> len(lv, 2), str(dv, 2);
v0[gslice(3, len, str)] = v1;
// v0 == valarray<char>("abcAeBgCijDlEnFp", 16)

end example]

valarray operator[](const valarray<bool>& boolarr) const;

Returns: A,valarray содержащий те элементы управляемой последовательности, которые обозначеныboolarr. [Example:

const valarray<char> v0("abcdefghijklmnop", 16);
const bool vb[] = { false, false, true, true, false, true };
// v0[valarray<bool>(vb, 6)] returns
// valarray<char>("cdf", 3)

end example]

mask_array<T> operator[](const valarray<bool>& boolarr);

Returns: Объект, содержащий ссылки на элементы контролируемой последовательности, выбранные с помощьюboolarr. [Example:

valarray<char> v0("abcdefghijklmnop", 16);
valarray<char> v1("ABC", 3);
const bool vb[] = { false, false, true, true, false, true };
v0[valarray<bool>(vb, 6)] = v1;
// v0 == valarray<char>("abABeCghijklmnop", 16)

end example]

valarray operator[](const valarray<size_t>& indarr) const;

Returns: A,valarray содержащий те элементы управляемой последовательности, которые обозначеныindarr. [Example:

const valarray<char> v0("abcdefghijklmnop", 16);
const size_t vi[] = { 7, 5, 2, 3, 8 };
// v0[valarray<size_­t>(vi, 5)] returns
// valarray<char>("hfcdi", 5)

end example]

indirect_array<T> operator[](const valarray<size_t>& indarr);

Returns: Объект, содержащий ссылки на элементы контролируемой последовательности, выбранные с помощьюindarr. [Example:

valarray<char> v0("abcdefghijklmnop", 16);
valarray<char> v1("ABCDE", 5);
const size_t vi[] = { 7, 5, 2, 3, 8 };
v0[valarray<size_t>(vi, 5)] = v1;
// v0 == valarray<char>("abCDeBgAEjklmnop", 16)

end example]

29.7.2.6 valarray unary operators [valarray.unary]

valarray operator+() const; valarray operator-() const; valarray operator~() const; valarray<bool> operator!() const;

Requires: Каждый из этих операторов может быть создан только для типа,T к которому может применяться указанный оператор и для которого указанный оператор возвращает значение типаT (bool для operator!) или которое может быть однозначно неявно преобразовано в тип T (bool дляoperator!).

Returns: Avalarray , длина которого равнаsize(). Каждый элемент возвращаемого массива инициализируется результатом применения указанного оператора к соответствующему элементу массива.

29.7.2.7 valarray compound assignment [valarray.cassign]

valarray& operator*= (const valarray& v); valarray& operator/= (const valarray& v); valarray& operator%= (const valarray& v); valarray& operator+= (const valarray& v); valarray& operator-= (const valarray& v); valarray& operator^= (const valarray& v); valarray& operator&= (const valarray& v); valarray& operator|= (const valarray& v); valarray& operator<<=(const valarray& v); valarray& operator>>=(const valarray& v);

Requires: size() == v.size(). Каждый из этих операторов может быть создан для типа только в томT случае, если указанный оператор может применяться к двум операндам типаT. Значение элемента в левой части составного оператора присваивания valarray не зависит от значения другого элемента в этой левой части.

Effects: Каждый из этих операторов выполняет указанную операцию над каждым из элементов*this и соответствующим элементомv.

Returns: *this.

Remarks: Появление массива в левой части составного присваивания не делает недействительными ссылки или указатели.

valarray& operator*= (const T& v); valarray& operator/= (const T& v); valarray& operator%= (const T& v); valarray& operator+= (const T& v); valarray& operator-= (const T& v); valarray& operator^= (const T& v); valarray& operator&= (const T& v); valarray& operator|= (const T& v); valarray& operator<<=(const T& v); valarray& operator>>=(const T& v);

Requires: Каждый из этих операторов может быть создан для типа только в томT случае, если указанный оператор может применяться к двум операндам типаT.

Effects: Каждый из этих операторов применяет указанную операцию к каждому элементу*this иv.

Returns: *this

Remarks: Появление массива в левой части составного присваивания не делает недействительными ссылки или указатели на элементы массива.

29.7.2.8 valarray member functions [valarray.members]

void swap(valarray& v) noexcept;

Effects:*this получает значение v.v получает значение*this.

Complexity: Постоянный.

size_t size() const;

Returns: Количество элементов в массиве.

Complexity: Постоянное время.

T sum() const;

Requires: size() > 0. Эта функция может быть создана только для типа,T к которому operator+= может применяться.

Returns: Сумма всех элементов массива. Если массив имеет длину 1, возвращает значение элемента 0. В противном случае возвращаемое значение вычисляется путем применения operator+= к копии элемента массива и всех других элементов массива в неопределенном порядке.

T min() const;

Requires: size() > 0

Returns: Минимальное значение, содержащееся в*this. Для массива длиной 1 возвращается значение элемента 0. Для всех остальных длин массивов определение производится с использованием operator<.

T max() const;

Requires: size() > 0.

Returns: Максимальное значение, содержащееся в*this. Для массива длиной 1 возвращается значение элемента 0. Для всех остальных длин массивов определение производится с использованием operator<.

valarray shift(int n) const;

Returns: Avalarray длиныsize(), каждый из элементов которого I равен (*this)[I + n] ifI + n , неотрицателен и меньше size(), в противном случаеT(). [ Note: Если нулевой элемент выбран как крайний левый элемент, положительное значениеn сдвигает элементы влевоn с нулевым заполнением. ]end note

[ Example: Если аргумент имеет значение -2, первые два элемента результата будут value-initialized; третьему элементу результата будет присвоено значение первого элемента аргумента; и т. д. ] end example

valarray cshift(int n) const;

Returns: Avalarray длины,size() которая представляет собой круговое смещение на*this. Если нулевой элемент выбран как крайний левый элемент, неотрицательное значениеn сдвигает элементы по кругу влево,n а отрицательное значениеn сдвигает элементы по кругу вправоn .

valarray apply(T func(T)) const; valarray apply(T func(const T&)) const;

Returns: Avalarray , длина которого равнаsize(). Каждому элементу возвращенного массива присваивается значение, возвращаемое путем применения функции аргумента к соответствующему элементу*this.

void resize(size_t sz, T c = T());

Effects: Изменяет длину*this массива наsz и затем присваивает каждому элементу значение второго аргумента. Изменение размера делает недействительными все указатели и ссылки на элементы в массиве.