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 шаблон не является ни классом матрицы, ни классом поля. Однако это очень полезный строительный блок для разработки таких классов.
valarray();
explicit valarray(size_t n);
Effects: Создает avalarray , имеющий длинуn. Каждый элемент массива равен value-initialized.
valarray(const T& v, size_t n);
valarray(const T* p, size_t n);
Requires: p указывает на array ([dcl.array]) как минимум из n элементов.
Effects: Создает avalarray , имеющий длинуn. Значения элементов массива инициализируются первыми n значениями, на которые указывает первый аргумент.278
valarray(const valarray& v);
valarray(valarray&& v) noexcept;
Effects: Создает avalarray , имеющий ту же длину, что иv. Элементы инициализируются значениями соответствующих элементовv.
valarray(initializer_list<T> il);
valarray(const slice_array<T>&);
valarray(const gslice_array<T>&);
valarray(const mask_array<T>&);
valarray(const indirect_array<T>&);
~valarray();
Effects: Деструктор применяется к каждому элементу *this; реализация может вернуть всю выделенную память.
Этот конструктор по умолчанию важен, посколькуvalarray могут быть полезны массивы . После инициализации длину пустого массива можно увеличить с помощью resize функции-члена.
Этот конструктор является предпочтительным методом преобразования массива C в valarray объект.
Этот конструктор копирования создает отдельный массив, а не псевдоним. Реализации, в которых массивы совместно используют хранилище, разрешены, но они должны реализовывать механизм копирования по ссылке, чтобы гарантировать, что массивы концептуально различны.
valarray& operator=(const valarray& v);
Effects: Каждому элементу *this массива присваивается значение соответствующего элементаv. Если длинаv не равна длине , перед выполнением присваивания*thisизменяется размер ,*this чтобы сделать два массива одинаковой длины, как при вызовеresize(v.size()).
valarray& operator=(valarray&& v) noexcept;
valarray& operator=(initializer_list<T> il);
valarray& operator=(const T& v);
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 оператора присваивания не зависит от значения другого элемента в этой левой части.
const T& operator[](size_t n) const;
T& operator[](size_t n);
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) вызвана функция-член или пока не закончится время жизни этого массива, в зависимости от того, что произойдет раньше.
Член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 ]
valarray operator+() const;
valarray operator-() const;
valarray operator~() const;
valarray<bool> operator!() const;
Requires: Каждый из этих операторов может быть создан только для типа,T к которому может применяться указанный оператор и для которого указанный оператор возвращает значение типаT (bool для operator!) или которое может быть однозначно неявно преобразовано в тип T (bool дляoperator!).
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.
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.
void swap(valarray& v) noexcept;
size_t size() const;
T sum() const;
Requires: size() > 0. Эта функция может быть создана только для типа,T к которому operator+= может применяться.
Returns: Сумма всех элементов массива. Если массив имеет длину 1, возвращает значение элемента 0. В противном случае возвращаемое значение вычисляется путем применения operator+= к копии элемента массива и всех других элементов массива в неопределенном порядке.
T min() const;
Returns: Минимальное значение, содержащееся в*this. Для массива длиной 1 возвращается значение элемента 0. Для всех остальных длин массивов определение производится с использованием operator<.
T max() const;
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());