В этом разделе описаны компоненты, которые программы на C ++ могут использовать для выполнения полуцифровых операций.
В следующих подпунктах описываются компоненты для типов комплексных чисел, генерации случайных чисел, числовых ( n-временно) массивов, обобщенных числовых алгоритмов и математических функций для типов с плавающей запятой, как показано в таблице 101.
Подпункт | Заголовок (ы) | |
[numerics.defns] | Определения | |
[numeric.requirements] | Требования | |
[cfenv] | Среда с плавающей точкой | <cfenv> |
[complex.numbers] | Сложные числа | <complex> |
[rand] | Генерация случайных чисел | <random> |
[numarray] | Числовые массивы | <valarray> |
[numeric.ops] | Обобщенные числовые операции | <numeric> |
[c.math] | Математические функции для | <cmath> |
типы с плавающей запятой | <cstdlib> |
Определите GENERALIZED_NONCOMMUTATIVE_SUM(op, a1, ..., aN) следующее:
a1 когда N есть 1, иначе
op(GENERALIZED_NONCOMMUTATIVE_SUM(op, a1, ..., aK),
op(GENERALIZED_NONCOMMUTATIVE_SUM(op, aM, ..., aN))
для любого K где 1<K+1=M≤N.
Компоненты complex и valarray параметризуются типом информации, которую они содержат и которыми управляют. Программа на C ++ должна создавать экземпляры этих компонентов только с типом, T который удовлетворяет следующим требованиям:267
T не является абстрактным классом (у него нет чистых виртуальных функций-членов);
T не является ссылочным типом;
T не имеет cv-квалификации;
Если T это класс, у него есть общедоступный конструктор по умолчанию;
Если T это класс, у него есть общедоступный конструктор копии с подписью T::T(const T&)
Если T это класс, у него есть открытый деструктор;
Если T это класс, то есть оператор общественного назначения , чья подпись либо T& T::operator=(const T&) или T& T::operator=(T)
Если T это класс, его оператор присваивания, конструкторы копирования и по умолчанию, а также деструктор должны соответствовать друг другу в следующем смысле:
Инициализация необработанного хранилища с использованием конструктора копирования для значения, независимо от T()полученного, семантически эквивалентна инициализации значения того же необработанного хранилища.
Инициализация необработанного хранилища с использованием конструктора по умолчанию с последующим назначением семантически эквивалентна инициализации необработанного хранилища с использованием конструктора копирования.
Уничтожение объекта с последующей инициализацией его необработанного хранилища с помощью конструктора копирования семантически эквивалентно назначению исходному объекту.
[ Note: Это правило частично заявляет, что не должно быть никаких тонких различий в семантике инициализации и присваивания. Это дает реализации значительную гибкость в инициализации массивов.
[ Example: Реализация может инициализировать a valarray путем выделения памяти с помощью new оператора (что подразумевает вызов конструктора по умолчанию для каждого элемента) и последующего присвоения каждому элементу его значения. Или реализация может выделить необработанное хранилище и использовать конструктор копирования для инициализации каждого элемента. ] — end example
Если различие между инициализацией и присваиванием важно для класса или если он не удовлетворяет любому из других условий, перечисленных выше, программист должен использовать vector вместо этого valarray для этого класса. ] — end note
Если T это класс, он не перегружает унарный operator&.
Кроме того, многие функции-члены и связанные функции valarray<T> могут быть успешно созданы и будут демонстрировать четко определенное поведение тогда и только тогда, когда T удовлетворяют дополнительным требованиям, указанным для каждого такого члена или связанной функции.
[ Example: Создание экземпляра допустимо valarray<complex>, но operator>() не будет успешно создано для valarray<complex> операндов, так complex как не имеет операторов упорядочивания. ] — end example
Другими словами, типы значений. К ним относятся арифметические типы, указатели, класс библиотеки complexи экземпляры valarray для типов значений.
#define FE_ALL_EXCEPT see below #define FE_DIVBYZERO see below #define FE_INEXACT see below #define FE_INVALID see below #define FE_OVERFLOW see below #define FE_UNDERFLOW see below #define FE_DOWNWARD see below #define FE_TONEAREST see below #define FE_TOWARDZERO see below #define FE_UPWARD see below #define FE_DFL_ENV see below namespace std { // types using fenv_t = object type; using fexcept_t = integer type; // functions int feclearexcept(int except); int fegetexceptflag(fexcept_t* pflag, int except); int feraiseexcept(int except); int fesetexceptflag(const fexcept_t* pflag, int except); int fetestexcept(int except); int fegetround(); int fesetround(int mode); int fegetenv(fenv_t* penv); int feholdexcept(fenv_t* penv); int fesetenv(const fenv_t* penv); int feupdateenv(const fenv_t* penv); }
Содержание и значение заголовка <cfenv> такие же , как заголовок стандартной библиотеки C <fenv.h>. [ Note: Этот международный стандарт не требует реализации для поддержки FENV_ACCESS прагмы; это определяется реализацией ( [cpp.pragma]), поддерживается ли прагма. Как следствие, это определяется реализацией, могут ли эти функции использоваться для проверки флагов состояния с плавающей запятой, установки режимов управления с плавающей запятой или работы с нестандартными настройками режима. Если прагма используется для включения управления средой с плавающей запятой, этот международный стандарт не определяет влияние на вычисление с плавающей запятой в константных выражениях. ] — end note
Среда с плавающей запятой имеет thread storage duration. Начальное состояние для среды с плавающей запятой потока - это состояние среды с плавающей запятой того потока, который конструирует соответствующий thread object объект во время создания объекта. [ Note: То есть дочерний поток получает состояние с плавающей запятой родительского потока во время создания дочернего потока. ] — end note
Заголовок определяет шаблон класса и многочисленные функции для представления и управления комплексными числами.<complex>
Эффект обработки шаблона complex для любого другого типа , чем float, doubleили long double не определен. Специальности complex<float>, complex<double>и complex<long double> являются literal types.
Если результат функции не определен математически или не входит в диапазон представимых значений для ее типа, поведение не определено.
Если z это lvalue-выражение типа, cv complex<T> то:
выражение reinterpret_cast<cv T(&)[2]>(z) должно быть правильным,
reinterpret_cast<cv T(&)[2]>(z)[0] обозначает действительную часть z, а
reinterpret_cast<cv T(&)[2]>(z)[1] обозначают мнимую часть z.
Более того, если a это выражение типа, cv complex<T>* а выражение a[i] четко определено для целочисленного выражения i, то:
reinterpret_cast<cv T*>(a)[2*i] обозначает действительную часть a[i], а
reinterpret_cast<cv T*>(a)[2*i + 1] обозначают мнимую часть a[i].
namespace std { template<class T> class complex; template<> class complex<float>; template<> class complex<double>; template<> class complex<long double>; // [complex.ops], operators template<class T> complex<T> operator+(const complex<T>&, const complex<T>&); template<class T> complex<T> operator+(const complex<T>&, const T&); template<class T> complex<T> operator+(const T&, const complex<T>&); template<class T> complex<T> operator-( const complex<T>&, const complex<T>&); template<class T> complex<T> operator-(const complex<T>&, const T&); template<class T> complex<T> operator-(const T&, const complex<T>&); template<class T> complex<T> operator*( const complex<T>&, const complex<T>&); template<class T> complex<T> operator*(const complex<T>&, const T&); template<class T> complex<T> operator*(const T&, const complex<T>&); template<class T> complex<T> operator/( const complex<T>&, const complex<T>&); template<class T> complex<T> operator/(const complex<T>&, const T&); template<class T> complex<T> operator/(const T&, const complex<T>&); template<class T> complex<T> operator+(const complex<T>&); template<class T> complex<T> operator-(const complex<T>&); template<class T> constexpr bool operator==( const complex<T>&, const complex<T>&); template<class T> constexpr bool operator==(const complex<T>&, const T&); template<class T> constexpr bool operator==(const T&, const complex<T>&); template<class T> constexpr bool operator!=(const complex<T>&, const complex<T>&); template<class T> constexpr bool operator!=(const complex<T>&, const T&); template<class T> constexpr bool operator!=(const T&, const complex<T>&); template<class T, class charT, class traits> basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>&, complex<T>&); template<class T, class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>&, const complex<T>&); // [complex.value.ops], values template<class T> constexpr T real(const complex<T>&); template<class T> constexpr T imag(const complex<T>&); template<class T> T abs(const complex<T>&); template<class T> T arg(const complex<T>&); template<class T> T norm(const complex<T>&); template<class T> complex<T> conj(const complex<T>&); template<class T> complex<T> proj(const complex<T>&); template<class T> complex<T> polar(const T&, const T& = 0); // [complex.transcendentals], transcendentals template<class T> complex<T> acos(const complex<T>&); template<class T> complex<T> asin(const complex<T>&); template<class T> complex<T> atan(const complex<T>&); template<class T> complex<T> acosh(const complex<T>&); template<class T> complex<T> asinh(const complex<T>&); template<class T> complex<T> atanh(const complex<T>&); template<class T> complex<T> cos (const complex<T>&); template<class T> complex<T> cosh (const complex<T>&); template<class T> complex<T> exp (const complex<T>&); template<class T> complex<T> log (const complex<T>&); template<class T> complex<T> log10(const complex<T>&); template<class T> complex<T> pow (const complex<T>&, const T&); template<class T> complex<T> pow (const complex<T>&, const complex<T>&); template<class T> complex<T> pow (const T&, const complex<T>&); template<class T> complex<T> sin (const complex<T>&); template<class T> complex<T> sinh (const complex<T>&); template<class T> complex<T> sqrt (const complex<T>&); template<class T> complex<T> tan (const complex<T>&); template<class T> complex<T> tanh (const complex<T>&); // [complex.literals], complex literals inline namespace literals { inline namespace complex_literals { constexpr complex<long double> operator""il(long double); constexpr complex<long double> operator""il(unsigned long long); constexpr complex<double> operator""i(long double); constexpr complex<double> operator""i(unsigned long long); constexpr complex<float> operator""if(long double); constexpr complex<float> operator""if(unsigned long long); } } }
namespace std { template<class T> class complex { public: using value_type = T; constexpr complex(const T& re = T(), const T& im = T()); constexpr complex(const complex&); template<class X> constexpr complex(const complex<X>&); constexpr T real() const; void real(T); constexpr T imag() const; void imag(T); complex<T>& operator= (const T&); complex<T>& operator+=(const T&); complex<T>& operator-=(const T&); complex<T>& operator*=(const T&); complex<T>& operator/=(const T&); complex& operator=(const complex&); template<class X> complex<T>& operator= (const complex<X>&); template<class X> complex<T>& operator+=(const complex<X>&); template<class X> complex<T>& operator-=(const complex<X>&); template<class X> complex<T>& operator*=(const complex<X>&); template<class X> complex<T>& operator/=(const complex<X>&); }; }
namespace std { template<> class complex<float> { public: using value_type = float; constexpr complex(float re = 0.0f, float im = 0.0f); constexpr explicit complex(const complex<double>&); constexpr explicit complex(const complex<long double>&); constexpr float real() const; void real(float); constexpr float imag() const; void imag(float); complex<float>& operator= (float); complex<float>& operator+=(float); complex<float>& operator-=(float); complex<float>& operator*=(float); complex<float>& operator/=(float); complex<float>& operator=(const complex<float>&); template<class X> complex<float>& operator= (const complex<X>&); template<class X> complex<float>& operator+=(const complex<X>&); template<class X> complex<float>& operator-=(const complex<X>&); template<class X> complex<float>& operator*=(const complex<X>&); template<class X> complex<float>& operator/=(const complex<X>&); }; template<> class complex<double> { public: using value_type = double; constexpr complex(double re = 0.0, double im = 0.0); constexpr complex(const complex<float>&); constexpr explicit complex(const complex<long double>&); constexpr double real() const; void real(double); constexpr double imag() const; void imag(double); complex<double>& operator= (double); complex<double>& operator+=(double); complex<double>& operator-=(double); complex<double>& operator*=(double); complex<double>& operator/=(double); complex<double>& operator=(const complex<double>&); template<class X> complex<double>& operator= (const complex<X>&); template<class X> complex<double>& operator+=(const complex<X>&); template<class X> complex<double>& operator-=(const complex<X>&); template<class X> complex<double>& operator*=(const complex<X>&); template<class X> complex<double>& operator/=(const complex<X>&); }; template<> class complex<long double> { public: using value_type = long double; constexpr complex(long double re = 0.0L, long double im = 0.0L); constexpr complex(const complex<float>&); constexpr complex(const complex<double>&); constexpr long double real() const; void real(long double); constexpr long double imag() const; void imag(long double); complex<long double>& operator=(const complex<long double>&); complex<long double>& operator= (long double); complex<long double>& operator+=(long double); complex<long double>& operator-=(long double); complex<long double>& operator*=(long double); complex<long double>& operator/=(long double); template<class X> complex<long double>& operator= (const complex<X>&); template<class X> complex<long double>& operator+=(const complex<X>&); template<class X> complex<long double>& operator-=(const complex<X>&); template<class X> complex<long double>& operator*=(const complex<X>&); template<class X> complex<long double>& operator/=(const complex<X>&); }; }
template<class T> constexpr complex(const T& re = T(), const T& im = T());
constexpr T real() const;
void real(T val);
constexpr T imag() const;
void imag(T val);
complex<T>& operator+=(const T& rhs);
Effects: Добавляет скалярное значение rhs к действительной части комплексного значения *this и сохраняет результат в действительной части *this, оставляя мнимую часть неизменной.
complex<T>& operator-=(const T& rhs);
Effects: Вычитает скалярное значение rhs из действительной части комплексного значения *this и сохраняет результат в действительной части *this, оставляя мнимую часть неизменной.
complex<T>& operator*=(const T& rhs);
Effects: Умножает скалярное значение rhs на комплексное значение *this и сохраняет результат в формате *this.
complex<T>& operator/=(const T& rhs);
template<class X> complex<T>& operator+=(const complex<X>& rhs);
Effects: Добавляет комплексное значение rhs к комплексному значению *this и сохраняет сумму в *this.
template<class X> complex<T>& operator-=(const complex<X>& rhs);
Effects: Вычитает комплексное значение rhs из комплексного значения *this и сохраняет разницу в *this.
template<class X> complex<T>& operator*=(const complex<X>& rhs);
Effects: Умножает комплексное значение rhs на комплексное значение *this и сохраняет продукт в *this.
template<class X> complex<T>& operator/=(const complex<X>& rhs);
template<class T> complex<T> operator+(const complex<T>& lhs);
template<class T> complex<T> operator+(const complex<T>& lhs, const complex<T>& rhs);
template<class T> complex<T> operator+(const complex<T>& lhs, const T& rhs);
template<class T> complex<T> operator+(const T& lhs, const complex<T>& rhs);
template<class T> complex<T> operator-(const complex<T>& lhs);
template<class T> complex<T> operator-(const complex<T>& lhs, const complex<T>& rhs);
template<class T> complex<T> operator-(const complex<T>& lhs, const T& rhs);
template<class T> complex<T> operator-(const T& lhs, const complex<T>& rhs);
template<class T> complex<T> operator*(const complex<T>& lhs, const complex<T>& rhs);
template<class T> complex<T> operator*(const complex<T>& lhs, const T& rhs);
template<class T> complex<T> operator*(const T& lhs, const complex<T>& rhs);
template<class T> complex<T> operator/(const complex<T>& lhs, const complex<T>& rhs);
template<class T> complex<T> operator/(const complex<T>& lhs, const T& rhs);
template<class T> complex<T> operator/(const T& lhs, const complex<T>& rhs);
template<class T> constexpr bool operator==(const complex<T>& lhs, const complex<T>& rhs);
template<class T> constexpr bool operator==(const complex<T>& lhs, const T& rhs);
template<class T> constexpr bool operator==(const T& lhs, const complex<T>& rhs);
template<class T> constexpr bool operator!=(const complex<T>& lhs, const complex<T>& rhs);
template<class T> constexpr bool operator!=(const complex<T>& lhs, const T& rhs);
template<class T> constexpr bool operator!=(const T& lhs, const complex<T>& rhs);
template<class T, class charT, class traits>
basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, complex<T>& x);
Effects: Экстракты комплексного числа x в виде: u, (u)или (u,v), где u это действительная часть и v мнимая часть ( [istream.formatted]).
Если обнаруживается неправильный ввод, вызывается is.setstate(ios_base::failbit) (который может throw ios::failure ( [iostate.flags])).
Remarks: Эта экстракция выполняется как серия более простых экстракций. Таким образом, пропуск пробелов должен быть одинаковым для всех более простых извлечений.
template<class T, class charT, class traits>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& o, const complex<T>& x);
Effects: Вставляет комплексное число x в поток, o как если бы это было реализовано следующим образом:
basic_ostringstream<charT, traits> s; s.flags(o.flags()); s.imbue(o.getloc()); s.precision(o.precision()); s << '(' << x.real() << "," << x.imag() << ')'; return o << s.str();
[ Note: В языковом стандарте, в котором запятая используется в качестве символа десятичной точки, использование запятой в качестве разделителя полей может быть неоднозначным. Вставка showpoint в выходной поток заставляет все выходные данные показывать явный десятичный знак; в результате все вставленные последовательности комплексных чисел могут быть однозначно извлечены. ] — end note
template<class T> constexpr T real(const complex<T>& x);
template<class T> constexpr T imag(const complex<T>& x);
template<class T> T abs(const complex<T>& x);
template<class T> T arg(const complex<T>& x);
template<class T> T norm(const complex<T>& x);
template<class T> complex<T> conj(const complex<T>& x);
template<class T> complex<T> proj(const complex<T>& x);
template<class T> complex<T> polar(const T& rho, const T& theta = 0);
template<class T> complex<T> acos(const complex<T>& x);
template<class T> complex<T> asin(const complex<T>& x);
template<class T> complex<T> atan(const complex<T>& x);
template<class T> complex<T> acosh(const complex<T>& x);
template<class T> complex<T> asinh(const complex<T>& x);
template<class T> complex<T> atanh(const complex<T>& x);
template<class T> complex<T> cos(const complex<T>& x);
template<class T> complex<T> cosh(const complex<T>& x);
template<class T> complex<T> exp(const complex<T>& x);
template<class T> complex<T> log(const complex<T>& x);
Returns: Комплексный натуральный eлогарифм по основанию x. Для всех x, imag(log(x)) лежит в интервале [−π, π], а когда x отрицательное вещественное число, imag(log(x)) является π.
template<class T> complex<T> log10(const complex<T>& x);
template<class T> complex<T> pow(const complex<T>& x, const complex<T>& y);
template<class T> complex<T> pow(const complex<T>& x, const T& y);
template<class T> complex<T> pow(const T& x, const complex<T>& y);
template<class T> complex<T> sin(const complex<T>& x);
template<class T> complex<T> sinh(const complex<T>& x);
template<class T> complex<T> sqrt(const complex<T>& x);
Returns: Комплексный квадратный корень из xдиапазона в правой полуплоскости. Если аргумент - отрицательное действительное число, возвращаемое значение лежит на положительной мнимой оси.
template<class T> complex<T> tan(const complex<T>& x);
template<class T> complex<T> tanh(const complex<T>& x);
Дополнительных перегрузок должно быть достаточно для обеспечения:
1.Если аргумент имеет тип long double, он фактически приводится к типу complex<long double>.
2.В противном случае, если аргумент имеет тип double или целочисленный тип, он эффективно приводится к complex<double>.
3.В противном случае, если аргумент имеет тип float, он фактически приводится к типу complex<float>.
Шаблон функции pow должен иметь дополнительные перегрузки, достаточные для обеспечения вызова хотя бы с одним аргументом типа complex<T>:
1.Если какой-либо из аргументов имеет тип complex<long double> или тип long double, то оба аргумента эффективно приводятся к complex<long double>.
2.В противном случае, если любой из аргументов имеет тип complex<double>, doubleили целочисленный тип, то оба аргумента эффективно приводятся к complex<double>.
3.В противном случае, если у любого из аргументов есть тип complex<float> или float, то оба аргумента эффективно приводятся к complex<float>.
В этом разделе описаны буквальные суффиксы для построения литералов комплексных чисел. Суффиксы i, ilи if создают комплексные числа типов complex<double>, complex<long double>и, complex<float> соответственно, при этом их мнимая часть обозначается заданным буквальным числом, а действительная часть равна нулю.
constexpr complex<long double> operator""il(long double d);
constexpr complex<long double> operator""il(unsigned long long d);
constexpr complex<double> operator""i(long double d);
constexpr complex<double> operator""i(unsigned long long d);
constexpr complex<float> operator""if(long double d);
constexpr complex<float> operator""if(unsigned long long d);
В дополнении к нескольким утилитам, четыре категории субъектов описана: uniform random bit generators, random number engines, random number engine adaptors, и random number distributions. Эти классификации применимы к типам, которые удовлетворяют соответствующим требованиям, к объектам, экземплярам которых создаются из таких типов, и к шаблонам, создающим такие типы при создании экземпляров. [ Note: Эти сущности определены таким образом, чтобы разрешить привязку любого однородного объекта генератора случайных битов e в качестве аргумента к любому объекту распределения случайных чисел d, создавая таким образом объект функции с нулевым аргументом, такой как заданный bind(d,e). ] — end note
Каждая из сущностей, указанных в этом подпункте, имеет ассоциированный объект, arithmetic type обозначенный как result_type. В T качестве result_type связанного с такой сущностью, эта сущность характеризуется:
a)как boolean или эквивалентно как boolean-valued, если T есть bool;
b)иначе как integral или эквивалентно как integer-valued, если numeric_limits<T>::is_integer есть true;
c)иначе как floating или эквивалентно как real-valued.
В случае целочисленного значения объект может дополнительно характеризоваться как signed или unsigned, в соответствии с numeric_limits<T>::is_signed.
Если не указано иное, во всех описаниях вычислений в этом подпункте используются математические действительные числа.
В этом подпункте операторы bitand , bitor и xor обозначают соответствующие стандартные побитовые операции. Дальше:
В этом подпункте [rand]эффект создания экземпляра шаблона:
a)с параметром типа шаблона с именем Sseq undefined, если соответствующий аргумент шаблона не является cv-unqualified и удовлетворяет требованиям seed sequence.
b)с параметром типа шаблона с именем URBG undefined, если соответствующий аргумент шаблона не является cv-unqualified и удовлетворяет требованиям uniform random bit generator.
c)с параметром типа шаблона с именем Engine undefined, если соответствующий аргумент шаблона не является cv-unqualified и удовлетворяет требованиям random number engine.
d)что параметр типа шаблона с именем RealType не определен , если соответствующий аргумент шаблона не резюме, неквалифицированное и один из float, doubleили long double.
e)который имеет тип параметра шаблона с именем IntType не определен , если соответствующий аргумент шаблона не резюме, неквалифицированные и один из short, int, long, long long, unsigned short, unsigned int, unsigned long, или unsigned long long.
f)что параметр типа шаблона с именем UIntType не определен , если соответствующий аргумент шаблона не резюме, неквалифицированное и один из unsigned short, unsigned int, unsigned longили unsigned long long.
В этом подпункте [rand]фразы вида « x является итератором определенного типа» должны интерпретироваться как эквивалентные более формальному требованию, что « x является значением типа, удовлетворяющим требованиям указанного типа итератора».
Является объектом , который потребляет последовательность целочисленных данных и производит требуемое число без знака целочисленных значений , на основе потребляемых данных. [ Такой объект предоставляет механизм, позволяющий избежать репликации потоков случайных значений. Это может быть полезно, например, в приложениях, требующих большого количества машин случайных чисел. ] seed sequence i 0≤i<232 Note: — end note
Класс S удовлетворяет требованиям начальной последовательности, если выражения, показанные в таблице 102 , действительны и имеют указанную семантику, а S также если они удовлетворяют всем другим требованиям этого раздела [rand.req.seedseq]. В этой таблице и в этом разделе:
a)T тип, названный Sассоциированным result_type;
b)q является значением S и, r возможно, константным значением S;
c)ib и ie являются итераторами ввода с целым числом без знака value_type длиной не менее 32 бит;
d)rb и re являются изменяемыми итераторами произвольного доступа с целым числом без знака value_type не менее 32 бит;
e)ob - итератор вывода; а также
f)il это значение initializer_list<T>.
Выражение | Тип возврата | До / после состояния | Сложность |
S::result_type | T | T представляет собой , unsigned integer type по меньшей мере , 32 бита. | время компиляции |
S() | Создает начальную последовательность с тем же начальным состоянием, что и все другие исходные последовательности типа, сконструированные по умолчанию S. | постоянный | |
S(ib,ie) | Создает начальную последовательность, имеющую внутреннее состояние, которое зависит от некоторых или всех битов предоставленной последовательности [ib,ie). | O(ie−ib) | |
S(il) | То же, что и S(il.begin(), il.end()). | такой же как S(il.begin(), il.end()) | |
q.generate(rb,re) | void | Ничего не делает, если rb == re. В противном случае заполняет предоставленную последовательность [rb,re) 32-битными величинами, которые зависят от последовательности, предоставленной конструктору, и, возможно, также зависят от истории generateпредыдущих вызовов. | O(re−rb) |
r.size() | size_t | Количество 32-битных единиц, которые будут скопированы при вызове r.param. | постоянный |
r.param(ob) | void | Копирует в указанное место назначения последовательность 32-битных единиц, которые могут быть предоставлены конструктору второго объекта типа S, и которые будут воспроизводить в этом втором объекте состояние, неотличимое от состояния первого объекта. | O(r.size()) |
uniform random bit generator g Типа G является функция объекта возвращение целого числа без знака значения , такой , что каждое значение в диапазоне возможных результатов имеет ( в идеале) , равная вероятности быть возвращены. [ Note: Степень gприближения результатов к идеалу часто определяется статистически. ] — end note
Класс G удовлетворяет требованиям a, uniform random bit generator если выражения, показанные в таблице 103 , действительны и имеют указанную семантику, а G также если удовлетворяет всем другим требованиям этого раздела [rand.req.urng]. В этой таблице и в этом разделе:
Выражение | Тип возврата | До / после состояния | Сложность |
G::result_type | T | T это unsigned integer type. | время компиляции |
g() | T | Возвращает значение в замкнутом интервале [G::min(), G::max()]. | амортизированная постоянная |
G::min() | T | Обозначает наименьшее значение, которое потенциально может вернуть operator(). | время компиляции |
G::max() | T | Обозначает наибольшее значение, которое потенциально может вернуть operator(). | время компиляции |
random number engine (Обычно сокращенно engine) e типа E является равномерной случайной генератор битов , что дополнительно отвечает требованиям (например, для посева , а также для ввода / вывода) , указанные в данном разделе.
В любой момент времени e имеет состояние ei для некоторого целого числа i≥0. При постройке e имеет исходное состояние e0. Состояние двигателя может быть установлено с помощью конструктора, seed функции, присваивания или подходящего operator>>.
Eспецификация должна определять:
a)размер Eсостояния, кратный размеру result_type, заданному как интегральное постоянное выражение;
b) transition algorithm TA , с помощью которого e«s государства ei продвигаются к его successor state ei+1; а также
c)с generation algorithm GA помощью которого состояние двигателя отображается на значение типа result_type.
Класс, E который удовлетворяет требованиям a, uniform random bit generator также удовлетворяет требованиям a, random number engine если выражения, показанные в таблице 104 , действительны и имеют указанную семантику, а E также if удовлетворяет всем другим требованиям этого раздела [rand.req.eng]. В этой таблице и в этом разделе:
a)T тип, названный Eассоциированным result_type;
b)e это значение E, v является именующим из E, x и y которые (возможно const) значения E;
c)s значение T;
d)q является lvalue, удовлетворяющим требованиям a seed sequence;
e)z это значение типа unsigned long long;
f)os - lvalue типа некоторой специализации шаблона класса basic_ostream<charT, traits>; а также
g)is - lvalue типа некоторой специализации шаблона класса basic_istream<charT, traits>;
где charT и traits ограничены согласно пунктам [strings] и пунктам [input.output].
Выражение | Тип возврата | До / после состояния | Сложность |
E() | Создает механизм с тем же начальным состоянием, что и все другие механизмы типа, построенные по умолчанию E. | O(size of state) | |
E(x) | Создает движок, который сравнивает равный x. | O(size of state) | |
E(s) | Создает движок с начальным состоянием, определяемым s. | O(size of state) | |
E(q)268 | Создает движок с начальным состоянием, которое зависит от последовательности, созданной одним вызовом q.generate. | q.generate такая же, как сложность вызываемой последовательности, длина которой равна размеру состояния | |
e.seed() | void | Postconditions: e == E(). | такой же как E() |
e.seed(s) | void | Postconditions: e == E(s). | такой же как E(s) |
e.seed(q) | void | Postconditions: e == E(q). | такой же как E(q) |
e() | T | Авансы eдержавотворческая ei к ei+1 =TA(ei) и возвращается GA(ei). | за таблицу 103 |
e.discard(z) 269 | void | Авансы eдержавотворческих ei к ei+z любому способу эквивалентного z последовательным вызовов e(). | не хуже сложности z последовательных звонков e() |
x == y | bool | Этот оператор является отношением эквивалентности. С Sx и Sy как бесконечные последовательности значений, которые будут сгенерированы повторными вызовами в будущем, x() и y(), соответственно, возвращает true if Sx=Sy; иначе возвращается false. | O(size of state) |
x != y | bool | !(x == y). | O(size of state) |
os << x | ссылка на тип os | Если os.fmtflags задано значение ios_base::dec|ios_base::left и символ заполнения установлен на пробел, os выполняется запись в текстовое представление xтекущего состояния. В выводе соседние числа разделяются одним или несколькими пробелами. И символ - заполнитель не изменяются. Postconditions: os.fmtflags | O(size of state) |
is >> v | ссылка на тип is | Если is.fmtflags установлено в ios_base::dec, устанавливает vсостояние, определяемое чтением его текстового представления из is. Если обнаружен неверный ввод, гарантирует, что vсостояние не изменится в результате операции и вызовов is.setstate(ios::failbit) (которые могут вызывать throw ios::failure ( [iostate.flags])). Если текстовое представление, записанное через, os << x было впоследствии прочитано через is >> v, то x == v при условии, что не было промежуточных вызовов of x или of v. Requires: is предоставляет текстовое представление, которое ранее было написано с использованием выходного потока, встроенная локаль которого была такой же, как и у is, и аргументы специализации шаблона charT и для которого traits были, соответственно, такими же, как у is. Неизменны. Postconditions: is.fmtflags | O(size of state) |
E должны соответствовать требованиям CopyConstructible и CopyAssignable типам. Каждая из этих операций должна быть по сложности не хуже O(size of state).
Этот конструктор (а также последующая соответствующая seed() функция) может быть особенно полезен для приложений, требующих большого количества независимых случайных последовательностей.
Эта операция распространена в пользовательском коде и часто может быть реализована специфичным для движка способом, чтобы обеспечить значительное улучшение производительности по сравнению с эквивалентным наивным циклом, который выполняет z последовательные вызовы e().
random number engine adaptor (Обычно сокращенно adaptor) a типа A является случайным числом двигателя , который принимает значения , полученные с помощью какого - либо другого случайных чисел двигателя, и применяет алгоритм для этих значений для того , чтобы поставить последовательность значений с различными свойствами случайности. Двигатель b типа , B адаптированный таким образом, называется base engine в этом контексте. Выражение a.base() должно быть действительным и должно возвращать константную ссылку на aбазовый движок.
Требования к типу двигателя со случайным числом должны интерпретироваться следующим образом по отношению к типу адаптера двигателя со случайным числом.
A::A();
bool operator==(const A& a1, const A& a2);
Returns: true если a1базовый двигатель равен a2базовому двигателю. В противном случае возвращается false.
A::A(result_type s);
template<class Sseq> A::A(Sseq& q);
void seed();
void seed(result_type s);
template<class Sseq> void seed(Sseq& q);
A также должны удовлетворять следующим дополнительным требованиям:
a)Сложность каждой функции не должна превышать сложность соответствующей функции, применяемой к базовому двигателю.
b)Состояние A должно включать состояние его базового двигателя. Размер Aгосударства должен быть не меньше размера базового двигателя.
c) AСостояние копирования (например, во время создания копии или назначения копии) должно включать в себя копирование состояния базового механизма A.
d)Текстовое представление A должно включать текстовое представление его базового двигателя.
random number distribution (Обычно сокращенно distribution) d типа D является функция объекта возвращение значения, которые распределены в соответствии с ассоциированным математическим probability density function p(z) или в соответствии с ассоциированным discrete probability function P(zi). Спецификация распределения определяет связанную с ним функцию вероятности p(z) или P(zi).
Соответствующая функция вероятности обычно выражается с помощью определенных поставляемых извне величин, известных как parameters of the distribution. Такие параметры распределения идентифицируются в этом контексте путем написания, например, p(z|a,b) или P(zi|a,b)для обозначения определенных параметров, или путем написания, например, p(z |{p}) или P(zi|{p}), для обозначения параметров распределения, p взятых в целом.
Класс D удовлетворяет требованиям a, random number distribution если выражения, показанные в таблице 105 , действительны и имеют указанную семантику, а if D и связанные с ним типы также удовлетворяют всем другим требованиям этого раздела [rand.req.dist]. В этой таблице и в этом разделе
a)T тип, названный Dассоциированным result_type;
b)P тип, названный Dассоциированным param_type;
c)d это значение D, а также x и y являются (возможно const) значения D;
d)glb и lub являются значениями T соответственно, соответствующими наибольшей нижней границе и наименьшей верхней границе значений, потенциально возвращаемых d's operator(), как определено текущими значениями dпараметров' s;
e)p является (возможно const) значением P;
f)g, g1и g2 являются l значениями типа, удовлетворяющими требованиям a uniform random bit generator;
g)os - lvalue типа некоторой специализации шаблона класса basic_ostream<charT, traits>; а также
h)is - lvalue типа некоторой специализации шаблона класса basic_istream<charT, traits>;
где charT и traits ограничены в соответствии с пунктами [strings] и [input.output].
Выражение | Тип возврата | До / после состояния | Сложность |
D::result_type | T | T это arithmetic type. | время компиляции |
D::param_type | P | время компиляции | |
D() | Создает распределение, поведение которого неотличимо от поведения любого другого вновь созданного по умолчанию распределения типа D. | постоянный | |
D(p) | Создает распределение, поведение которого неотличимо от поведения вновь созданного распределения, непосредственно из значений, используемых для построения p. | такая же, как pи конструкция | |
d.reset() | void | Последующее использование d не зависит от значений, созданных каким-либо механизмом перед вызовом reset. | постоянный |
x.param() | P | Возвращает такое значение p , что D(p).param() == p. | не хуже, чем сложность D(p) |
d.param(p) | void | Postconditions: d.param() == p. | не хуже, чем сложность D(p) |
d(g) | T | С p=d.param(), последовательность чисел, возвращаемая последовательными вызовами одного и того же объекта g , случайным образом распределяется в соответствии с ассоциированной функцией p(z |{p}) или P(zi|{p}). | амортизируемое постоянное количество вызовов g |
d(g,p) | T | Последовательность чисел, возвращаемая последовательными вызовами одних g и тех же объектов, p случайным образом распределяется в соответствии с ассоциированной функцией p(z |{p}) или P(zi|{p})функцией. | амортизируемое постоянное количество вызовов g |
x.min() | T | Возврат glb. | постоянный |
x.max() | T | Возврат lub. | постоянный |
x == y | bool | Этот оператор является отношением эквивалентности. Возвращает true if x.param() == y.param() и S1=S2, где S1 и S2 - бесконечные последовательности значений, которые будут генерироваться, соответственно, повторными вызовами в будущем x(g1) и y(g2) всякий раз g1 == g2. В противном случае возвращается false. | постоянный |
x != y | bool | !(x == y). | так же, как x == y. |
os << x | ссылка на тип os | Записывает в os текстовое представление параметры и дополнительные внутренние данные x. И символ - заполнитель не изменяются. Postconditions: os.fmtflags | |
is >> d | ссылка на тип is | Восстанавливается из is параметров и дополнительных внутренних данных lvalue d. Если обнаружен неправильный ввод, гарантирует, что d операция и вызовы не изменят его is.setstate(ios::failbit) (что может вызвать throw ios::failure ( [iostate.flags])). Requires: is обеспечивает текстовое представление , которое было ранее написанным используя os которого пронизана локаль и чьи аргументы шаблона специализации типа в charT и traits были такими же , как те is. Неизменны. Postconditions: is.fmtflags |
Последовательность чисел, полученная при повторных вызовах, d(g) должна быть независимой от любого вызова os << d или какой-либо const функции-члена D между любыми вызовами d(g).
Если текстовое представление написано с использованием os << x и это представление восстанавливается в тот же или другой объект y того же типа с использованием is >> y, повторные вызовы y(g) должны производить ту же последовательность чисел, что и повторные вызовы x(g).
Не указано, D::param_type объявлен ли он как (вложенный) class или через typedef. В этом подпункте [rand]объявления D::param_type используются в форме typedefs только для удобства изложения.
Для каждого из конструкторов, D принимающих аргументы, соответствующие параметрам распределения, P должен быть соответствующий конструктор, подчиняющийся тем же требованиям и принимающий аргументы, идентичные по количеству, типу и значениям по умолчанию. Более того, для каждой из функций-членов D этих возвращаемых значений, соответствующих параметрам распределения, P должна быть соответствующая функция-член с идентичным именем, типом и семантикой.
#include <initializer_list> namespace std { // [rand.eng.lcong], class template linear_congruential_engine template<class UIntType, UIntType a, UIntType c, UIntType m> class linear_congruential_engine; // [rand.eng.mers], class template mersenne_twister_engine template<class UIntType, size_t w, size_t n, size_t m, size_t r, UIntType a, size_t u, UIntType d, size_t s, UIntType b, size_t t, UIntType c, size_t l, UIntType f> class mersenne_twister_engine; // [rand.eng.sub], class template subtract_with_carry_engine template<class UIntType, size_t w, size_t s, size_t r> class subtract_with_carry_engine; // [rand.adapt.disc], class template discard_block_engine template<class Engine, size_t p, size_t r> class discard_block_engine; // [rand.adapt.ibits], class template independent_bits_engine template<class Engine, size_t w, class UIntType> class independent_bits_engine; // [rand.adapt.shuf], class template shuffle_order_engine template<class Engine, size_t k> class shuffle_order_engine; // [rand.predef], engines and engine adaptors with predefined parameters using minstd_rand0 = see below; using minstd_rand = see below; using mt19937 = see below; using mt19937_64 = see below; using ranlux24_base = see below; using ranlux48_base = see below; using ranlux24 = see below; using ranlux48 = see below; using knuth_b = see below; using default_random_engine = see below; // [rand.device], class random_device class random_device; // [rand.util.seedseq], class seed_seq class seed_seq; // [rand.util.canonical], function template generate_canonical template<class RealType, size_t bits, class URBG> RealType generate_canonical(URBG& g); // [rand.dist.uni.int], class template uniform_int_distribution template<class IntType = int> class uniform_int_distribution; // [rand.dist.uni.real], class template uniform_real_distribution template<class RealType = double> class uniform_real_distribution; // [rand.dist.bern.bernoulli], class bernoulli_distribution class bernoulli_distribution; // [rand.dist.bern.bin], class template binomial_distribution template<class IntType = int> class binomial_distribution; // [rand.dist.bern.geo], class template geometric_distribution template<class IntType = int> class geometric_distribution; // [rand.dist.bern.negbin], class template negative_binomial_distribution template<class IntType = int> class negative_binomial_distribution; // [rand.dist.pois.poisson], class template poisson_distribution template<class IntType = int> class poisson_distribution; // [rand.dist.pois.exp], class template exponential_distribution template<class RealType = double> class exponential_distribution; // [rand.dist.pois.gamma], class template gamma_distribution template<class RealType = double> class gamma_distribution; // [rand.dist.pois.weibull], class template weibull_distribution template<class RealType = double> class weibull_distribution; // [rand.dist.pois.extreme], class template extreme_value_distribution template<class RealType = double> class extreme_value_distribution; // [rand.dist.norm.normal], class template normal_distribution template<class RealType = double> class normal_distribution; // [rand.dist.norm.lognormal], class template lognormal_distribution template<class RealType = double> class lognormal_distribution; // [rand.dist.norm.chisq], class template chi_squared_distribution template<class RealType = double> class chi_squared_distribution; // [rand.dist.norm.cauchy], class template cauchy_distribution template<class RealType = double> class cauchy_distribution; // [rand.dist.norm.f], class template fisher_f_distribution template<class RealType = double> class fisher_f_distribution; // [rand.dist.norm.t], class template student_t_distribution template<class RealType = double> class student_t_distribution; // [rand.dist.samp.discrete], class template discrete_distribution template<class IntType = int> class discrete_distribution; // [rand.dist.samp.pconst], class template piecewise_constant_distribution template<class RealType = double> class piecewise_constant_distribution; // [rand.dist.samp.plinear], class template piecewise_linear_distribution template<class RealType = double> class piecewise_linear_distribution; }
Каждый тип, созданный из шаблона класса, указанного в этом разделе, [rand.eng] удовлетворяет требованиям random number engine типа.
Если не указано иное, сложность каждой функции, указанной в этом разделе, [rand.eng] является постоянной.
Если не указано иное, ни одна функция, описанная в этом разделе, не [rand.eng] вызывает исключение.
Каждая функция, описанная в этом разделе, [rand.eng] которая имеет параметр функции q типа Sseq& для параметра типа шаблона с именем Sseq , отличным от типа, seed_seq вызывает то, что и когда q.generate вызывает вызов throw.
Описания представлены в этом разделе [rand.eng] только для операций двигателя, которые не описаны, [rand.req.eng] или для операций, для которых имеется дополнительная семантическая информация. В частности, объявления для конструкторов копирования, для операторов присваивания копий, для операторов потоковой передачи и для операторов равенства и неравенства не показаны в резюме.
Каждый шаблон, указанный в этом разделе, [rand.eng] требует удержания одного или нескольких отношений, включающих значение (значения) не относящихся к типу параметров шаблона. Программа, реализующая любой из этих шаблонов, плохо сформирована, если какая-либо такая требуемая взаимосвязь не выполняется.
Для каждого механизма случайных чисел и для каждого адаптера механизма случайных чисел, X определенных в этом подпункте ( [rand.eng]) и в подпункте [rand.adapt]:
если конструктор
template <class Sseq> explicit X(Sseq& q);
вызывается с типом Sseq , который не квалифицируется как начальная последовательность, тогда этот конструктор не должен участвовать в разрешении перегрузки;
если функция-член
template <class Sseq> void seed(Sseq& q);
вызывается с типом Sseq , который не квалифицируется как начальная последовательность, то эта функция не должна участвовать в разрешении перегрузки.
Степень, в которой реализация определяет, что тип не может быть начальной последовательностью, не указана, за исключением того, что, как минимум, тип не должен квалифицироваться как начальная последовательность, если он неявно конвертируется в X::result_type.
Механизм linear_congruential_engine случайных чисел производит беззнаковые целые случайные числа. Состояние из объекта имеет размер и состоит из одного целого числа. Алгоритм перехода представляет собой модульную линейную функцию формы ; алгоритм генерации есть . xi linear_congruential_engine x 1TA(xi)=(a⋅xi+c)modm GA(xi)=xi+1
template<class UIntType, UIntType a, UIntType c, UIntType m> class linear_congruential_engine { public: // types using result_type = UIntType; // engine characteristics static constexpr result_type multiplier = a; static constexpr result_type increment = c; static constexpr result_type modulus = m; static constexpr result_type min() { return c == 0u ? 1u: 0u; } static constexpr result_type max() { return m - 1u; } static constexpr result_type default_seed = 1u; // constructors and seeding functions explicit linear_congruential_engine(result_type s = default_seed); template<class Sseq> explicit linear_congruential_engine(Sseq& q); void seed(result_type s = default_seed); template<class Sseq> void seed(Sseq& q); // generating functions result_type operator()(); void discard(unsigned long long z); };
Если параметр шаблона m равен 0, модуль, m используемый в этом разделе, равен плюсу . [ не обязательно представлять как значение типа . ] [rand.eng.lcong] numeric_limits<result_type>::max() 1 Note: m result_type — end note
explicit linear_congruential_engine(result_type s = default_seed);
Effects: Создает linear_congruential_engine объект. Если cmodm есть 0 и smodm есть 0, устанавливает состояние двигателя в 1, в противном случае устанавливает состояние двигателя в smodm.
template<class Sseq> explicit linear_congruential_engine(Sseq& q);
Effects: Создает linear_congruential_engine объект. С k=⌈log2m32⌉ и a массивом (или эквивалентом) длины k+3вызывает, q.generate(a+0, a+k+3) а затем вычисляет S=(∑k−1j=0aj+3⋅232j)modm. Если cmodm есть 0 и S есть 0, устанавливает состояние двигателя в 1, иначе устанавливает состояние двигателя в S.
Механизм mersenne_twister_engine случайных чисел 270 производит беззнаковые целые случайные числа в закрытом интервале [0,2w−1]. Состояние из объекта имеет размер и состоит из последовательности из значений типа поставляемого ; все применяемые индексы следует брать по модулю .xi mersenne_twister_engine x n X n x X n
Алгоритм перехода использует сдвиговый регистр с обобщенной обратной связью, определяемый значениями сдвига и , значением поворота и условной xor-маской . Чтобы улучшить однородность результата, биты необработанного регистра сдвига дополнительно (т. Е. Скремблируются) в соответствии с матрицей битового скремблирования, определенной значениями и . n m r a tempered u,d,s,b,t,c, ℓ
Переход между состояниями выполняется следующим образом:
a)Соедините верхние w−r биты Xi−n с младшими r битами, Xi+1−n чтобы получить беззнаковое целое число Y.
b)С α=a⋅(Ybitand1), установите Xi на Xi+m−nxor(Yrshift1)xorα.
Последовательность X инициализируется с помощью множителя инициализации f.
Алгоритм генерации определяет беззнаковые целочисленные значения следующим образом, а затем выдает в качестве своего результата: z1,z2,z3,z4 z4
a)Пусть z1=Xixor((Xirshiftu)bitandd).
b)Пусть z2=z1xor((z1lshiftws)bitandb).
c)Пусть z3=z2xor((z2lshiftwt)bitandc).
d)Пусть z4=z3xor(z3rshiftℓ).
template<class UIntType, size_t w, size_t n, size_t m, size_t r, UIntType a, size_t u, UIntType d, size_t s, UIntType b, size_t t, UIntType c, size_t l, UIntType f> class mersenne_twister_engine { public: // types using result_type = UIntType; // engine characteristics static constexpr size_t word_size = w; static constexpr size_t state_size = n; static constexpr size_t shift_size = m; static constexpr size_t mask_bits = r; static constexpr UIntType xor_mask = a; static constexpr size_t tempering_u = u; static constexpr UIntType tempering_d = d; static constexpr size_t tempering_s = s; static constexpr UIntType tempering_b = b; static constexpr size_t tempering_t = t; static constexpr UIntType tempering_c = c; static constexpr size_t tempering_l = l; static constexpr UIntType initialization_multiplier = f; static constexpr result_type min() { return 0; } static constexpr result_type max() { return 2w−1; } static constexpr result_type default_seed = 5489u; // constructors and seeding functions explicit mersenne_twister_engine(result_type value = default_seed); template<class Sseq> explicit mersenne_twister_engine(Sseq& q); void seed(result_type value = default_seed); template<class Sseq> void seed(Sseq& q); // generating functions result_type operator()(); void discard(unsigned long long z); };
Следующие соотношения должны занимать: 0 < m, m <= n, 2u < w, r <= w, u <= w, s <= w, t <= w, l <= w, w <= numeric_limits<UIntType>::digits, a <= (1u<<w) - 1u, b <= (1u<<w) - 1u, c <= (1u<<w) - 1u, d <= (1u<<w) - 1u, и f <= (1u<<w) - 1u.
explicit mersenne_twister_engine(result_type value = default_seed);
Effects: Создает mersenne_twister_engine объект. Устанавливается X−n на valuemod2w. Затем итеративно для i=1−n,…,−1, наборы Xi для
[f⋅(Xi−1xor(Xi−1rshift(w−2)))+imodn]mod2w.
template<class Sseq> explicit mersenne_twister_engine(Sseq& q);
Effects: Создает mersenne_twister_engine объект. With k=⌈w/32⌉ и a массив (или эквивалент) длины n⋅kвызывает, q.generate(a+0, a+n⋅k) а затем, итеративно для i=−n,…,−1, устанавливает Xi значение (∑k−1j=0ak(i+n)+j⋅232j)mod2w. Наконец, если наиболее значимые w−r биты X−n равны нуль, и если каждый из других в результате чего Xi это 0, изменяется X−n с 2w−1.
Название этого механизма частично относится к свойству его периода: для правильно выбранных значений параметров период тесно связан с большим простым числом Мерсенна.
Механизм subtract_with_carry_engine случайных чисел производит беззнаковые целые случайные числа.
Состояние из объекта имеет размера , и состоит из последовательности из целочисленных значений ; все применяемые индексы следует брать по модулю . Состояние дополнительно состоит из целого числа (известного как ) , значение которого равно или . xi subtract_with_carry_engine xO(r) X r 0≤Xi<m=2w X r xi c carry 0 1
Переход между состояниями выполняется следующим образом:
a)Пусть Y=Xi−s−Xi−r−c.
b)Установите Xi на y=Ymodm. Установите c в 1, если Y<0, в противном случае установите c в 0.
[ Note: Этот алгоритм соответствует модульной линейной функции вида TA(xi)=(a⋅xi)modb, где b имеет вид mr−ms+1 и a=b−(b−1)/m. ] — end note
Алгоритм генерации задается формулой , где - значение, полученное в результате улучшения состояния двигателя, как описано выше.GA(xi)=y y
template<class UIntType, size_t w, size_t s, size_t r> class subtract_with_carry_engine { public: // types using result_type = UIntType; // engine characteristics static constexpr size_t word_size = w; static constexpr size_t short_lag = s; static constexpr size_t long_lag = r; static constexpr result_type min() { return 0; } static constexpr result_type max() { return m−1; } static constexpr result_type default_seed = 19780503u; // constructors and seeding functions explicit subtract_with_carry_engine(result_type value = default_seed); template<class Sseq> explicit subtract_with_carry_engine(Sseq& q); void seed(result_type value = default_seed); template<class Sseq> void seed(Sseq& q); // generating functions result_type operator()(); void discard(unsigned long long z); };
Следующие соотношения должны проводить: 0u < s, s < r, 0 < w, и w <= numeric_limits<UIntType>::digits.
Текстовое представление состоит из значений в указанном порядке, за которыми следует . Xi−r,…,Xi−1 c
explicit subtract_with_carry_engine(result_type value = default_seed);
Effects: Создает subtract_with_carry_engine объект. Устанавливает значения X−r,…,X−1в указанном ниже порядке в указанном ниже порядке. Если X−1 есть, то 0устанавливается c в 1; в противном случае устанавливается c на 0.
Для того, чтобы установить значение Xk, первые построить e, А linear_congruential_engine объект, как если бы по следующему определению:
linear_congruential_engine<result_type, 40014u,0u,2147483563u> e(value == 0u ? default_seed : value);
Затем, чтобы установить каждый Xk, получить новые значения z0,…,zn−1 из n=⌈w/32⌉ последовательных вызовов e взятого по модулю 232. Установите Xk на (∑n−1j=0zj⋅232j)modm.
template<class Sseq> explicit subtract_with_carry_engine(Sseq& q);
Effects: Создает subtract_with_carry_engine объект. With k=⌈w/32⌉ и a массив (или эквивалент) длины r⋅kвызывает, q.generate(a+0, a+r⋅k) а затем, итеративно для i=−r,…,−1, устанавливает Xi значение (∑k−1j=0ak(i+r)+j⋅232j)modm. Если X−1 есть, то 0устанавливается c в 1; в противном случае устанавливается c на 0.
Каждый тип, созданный из шаблона класса, указанного в этом разделе, [rand.adapt] удовлетворяет требованиям random number engine adaptor типа.
Если не указано иное, сложность каждой функции, указанной в этом разделе, [rand.adapt] является постоянной.
Если не указано иное, ни одна функция, описанная в этом разделе, не [rand.adapt] вызывает исключение.
Каждая функция, описанная в этом разделе, [rand.adapt] которая имеет параметр функции q типа Sseq& для параметра типа шаблона с именем Sseq , отличным от типа, seed_seq вызывает то, что и когда q.generate вызывает вызов throw.
Описание предоставляется в этом разделе [rand.adapt] только для операций адаптера, которые не описаны в разделе, [rand.req.adapt] или для операций, для которых существует дополнительная семантическая информация. В частности, объявления для конструкторов копирования, для операторов присваивания копий, для операторов потоковой передачи и для операторов равенства и неравенства не показаны в резюме.
Каждый шаблон, указанный в этом разделе, [rand.adapt] требует удержания одного или нескольких отношений, включающих значение (значения) не относящихся к типу параметров шаблона. Программа, реализующая любой из этих шаблонов, плохо сформирована, если какая-либо такая требуемая взаимосвязь не выполняется.
discard_block_engine Случайным образом номера адаптер двигателя производит случайные числа , выбранные из производства некоторых базового двигателя e. Состояние из объекта адаптера двигателя состоит из состояния своего базового двигателя и дополнительного целого числа . Размер государства равен размеру государства плюс . xi discard_block_engine x ei e n e 1
Алгоритм перехода отбрасывает все значения, кроме значений, из каждого блока значений, предоставленного . Переход между состояниями выполняется следующим образом: Если , переместите состояние из в и установите в . В любом случае, затем увеличивайте и продвигайте текущее состояние до . r>0 p≥r e n≥r e ei ei+p−r n 0 n e ej ej+1
Алгоритм генерации выдает значение, возвращенное последним вызовом состояния при продвижении , как описано выше. e() e
template<class Engine, size_t p, size_t r> class discard_block_engine { public: // types using result_type = typename Engine::result_type; // engine characteristics static constexpr size_t block_size = p; static constexpr size_t used_block = r; static constexpr result_type min() { return Engine::min(); } static constexpr result_type max() { return Engine::max(); } // constructors and seeding functions discard_block_engine(); explicit discard_block_engine(const Engine& e); explicit discard_block_engine(Engine&& e); explicit discard_block_engine(result_type s); template<class Sseq> explicit discard_block_engine(Sseq& q); void seed(); void seed(result_type s); template<class Sseq> void seed(Sseq& q); // generating functions result_type operator()(); void discard(unsigned long long z); // property functions const Engine& base() const noexcept { return e; }; private: Engine e; // exposition only int n; // exposition only };
В дополнение к своему поведению в соответствии с разделом [rand.req.adapt]каждый конструктор, который не является конструктором копирования, устанавливает n значение 0.
An independent_bits_engine адаптер сочетает в себе случайное число случайных чисел двигателей, которые производятся некоторым базовым двигателем e, таким образом , чтобы произвести случайные числа с заданным количеством битов w. Состояние из объекта адаптера двигателя состоит из состояния своего базового двигателя ; размер государства - это размер российского государства. xi independent_bits_engine x ei e e
Алгоритмы перехода и генерации описываются следующими интегральными константами:
a)Пусть R=e.max() - e.min() + 1 и m=⌊log2R⌋.
b)С , n как определено ниже, пусть w0=⌊w/n⌋, n0=n−wmodn, y0=2w0⌊R/2w0⌋и y1=2w0+1⌊R/2w0+1⌋.
c)Пусть n=⌈w/m⌉ тогда и только тогда, когда в результате соотношение R−y0≤⌊y0/n⌋ выполняется. Иначе пусть n=1+⌈w/m⌉.
[ Note: Отношение w=n0w0+(n−n0)(w0+1) всегда сохраняется. ] — end note
Алгоритм перехода выполняется путем вызова по мере необходимости для получения значений меньше чем и значений меньше чем . e() n0y0+e.min() n−n0 y1+e.min()
Алгоритм генерации использует значения, полученные при продвижении состояния, как описано выше, чтобы получить количество, полученное, как если бы по следующему алгоритму: S
S = 0; for (k = 0; k≠n0; k += 1) { do u = e() - e.min(); while (u≥y0); S = 2w0⋅S+umod2w0; } for (k = n0; k≠n; k += 1) { do u = e() - e.min(); while (u≥y1); S = 2w0+1⋅S+umod2w0+1; }
template<class Engine, size_t w, class UIntType> class independent_bits_engine { public: // types using result_type = UIntType; // engine characteristics static constexpr result_type min() { return 0; } static constexpr result_type max() { return 2w−1; } // constructors and seeding functions independent_bits_engine(); explicit independent_bits_engine(const Engine& e); explicit independent_bits_engine(Engine&& e); explicit independent_bits_engine(result_type s); template<class Sseq> explicit independent_bits_engine(Sseq& q); void seed(); void seed(result_type s); template<class Sseq> void seed(Sseq& q); // generating functions result_type operator()(); void discard(unsigned long long z); // property functions const Engine& base() const noexcept { return e; }; private: Engine e; // exposition only };
shuffle_order_engine Случайным образом номер адаптера двигатель производит те же самые случайные числа, которые производятся некоторым базовым двигателем e, но доставляет их в другой последовательности. Состояние из объекта адаптера двигателя состоит из состояния своего базового двигателя , дополнительное значение типа поставляемого и дополнительная последовательность из значений и типа поставляемого . Размер государства равен размеру государства плюс . xi shuffle_order_engine x ei e Y e V k e e k+1
Алгоритм перехода переставляет значения, создаваемые . Переход между состояниями выполняется следующим образом: e
Алгоритм генерации выдает последнее значение, полученное при продвижении , как описано выше. Y e
template<class Engine, size_t k> class shuffle_order_engine { public: // types using result_type = typename Engine::result_type; // engine characteristics static constexpr size_t table_size = k; static constexpr result_type min() { return Engine::min(); } static constexpr result_type max() { return Engine::max(); } // constructors and seeding functions shuffle_order_engine(); explicit shuffle_order_engine(const Engine& e); explicit shuffle_order_engine(Engine&& e); explicit shuffle_order_engine(result_type s); template<class Sseq> explicit shuffle_order_engine(Sseq& q); void seed(); void seed(result_type s); template<class Sseq> void seed(Sseq& q); // generating functions result_type operator()(); void discard(unsigned long long z); // property functions const Engine& base() const noexcept { return e; }; private: Engine e; // exposition only result_type V[k]; // exposition only result_type Y; // exposition only };
Текстовое представление состоит из текстового представления , за которым следуют значения , за которыми следует значение . e k V Y
В дополнение к своему поведению в соответствии с разделом [rand.req.adapt], каждый конструктор, который не является конструктором копирования, инициализируется V[0],…,V[k-1] и Yв этом порядке значениями, возвращаемыми последовательными вызовами e().
using minstd_rand0 =
linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647>;
Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а minstd_rand0 должен получить значение 1043618065.
using minstd_rand =
linear_congruential_engine<uint_fast32_t, 48271, 0, 2147483647>;
Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а minstd_rand должен получить значение 399268537.
using mt19937 =
mersenne_twister_engine<uint_fast32_t,
32,624,397,31,0x9908b0df,11,0xffffffff,7,0x9d2c5680,15,0xefc60000,18,1812433253>;
Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а mt19937 должен получить значение 4123659995.
using mt19937_64 =
mersenne_twister_engine<uint_fast64_t,
64,312,156,31,0xb5026f5aa96619e9,29,
0x5555555555555555,17,
0x71d67fffeda60000,37,
0xfff7eee000000000,43,
6364136223846793005>;
Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а mt19937_64 должен получить значение 9981545732273789042.
using ranlux24_base =
subtract_with_carry_engine<uint_fast32_t, 24, 10, 24>;
Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а ranlux24_base должен получить значение 7937952.
using ranlux48_base =
subtract_with_carry_engine<uint_fast64_t, 48, 5, 12>;
Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а ranlux48_base должен получить значение 61839128582725.
using ranlux24 = discard_block_engine<ranlux24_base, 223, 23>;
Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а ranlux24 должен получить значение 9901578.
using ranlux48 = discard_block_engine<ranlux48_base, 389, 11>;
Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а ranlux48 должен получить значение 249142670248501.
using knuth_b = shuffle_order_engine<minstd_rand0,256>;
Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а knuth_b должен получить значение 1112339016.
using default_random_engine = implementation-defined;
Remarks: Выбор типа двигателя, названного этим, typedef определяется реализацией. [ Note: Реализация может выбрать этот тип на основе производительности, размера, качества или любой комбинации таких факторов, чтобы обеспечить, по крайней мере, приемлемое поведение двигателя для относительно случайного, неопытного и / или легкого использования. Поскольку разные реализации могут выбирать разные типы базовых механизмов, код, использующий это, typedef не должен генерировать идентичные последовательности для разных реализаций. ] — end note
random_device Равномерный случайный бит генератор производит недетерминированные случайные числа.
Если ограничения реализации не позволяют генерировать недетерминированные случайные числа, реализация может использовать механизм случайных чисел.
class random_device { public: // types using result_type = unsigned int; // generator characteristics static constexpr result_type min() { return numeric_limits<result_type>::min(); } static constexpr result_type max() { return numeric_limits<result_type>::max(); } // constructors explicit random_device(const string& token = implementation-defined); // generating functions result_type operator()(); // property functions double entropy() const noexcept; // no copy functions random_device(const random_device& ) = delete; void operator=(const random_device& ) = delete; };
explicit random_device(const string& token = implementation-defined);
double entropy() const noexcept;
result_type operator()();
Параметр предназначен для того, чтобы реализация могла различать разные источники случайности.
Если у устройства есть n состояния, соответствующие вероятности которых равны
P0,…,Pn−1, энтропия устройства S определяется как
S=−∑n−1i=0Pi⋅logPi.
class seed_seq { public: // types using result_type = uint_least32_t; // constructors seed_seq(); template<class T> seed_seq(initializer_list<T> il); template<class InputIterator> seed_seq(InputIterator begin, InputIterator end); // generating functions template<class RandomAccessIterator> void generate(RandomAccessIterator begin, RandomAccessIterator end); // property functions size_t size() const noexcept; template<class OutputIterator> void param(OutputIterator dest) const; // no copy functions seed_seq(const seed_seq& ) = delete; void operator=(const seed_seq& ) = delete; private: vector<result_type> v; // exposition only };
seed_seq();
template<class T>
seed_seq(initializer_list<T> il);
template<class InputIterator>
seed_seq(InputIterator begin, InputIterator end);
Requires: InputIterator должны удовлетворять требованиям input iterator типа. Кроме того, iterator_traits<InputIterator>::value_type будет обозначать целочисленный тип.
Effects: Создает seed_seq объект по следующему алгоритму:
for( InputIterator s = begin; s != end; ++s)
v.push_back((*s)mod232);
template<class RandomAccessIterator>
void generate(RandomAccessIterator begin, RandomAccessIterator end);
Requires: RandomAccessIterator должен соответствовать требованиям изменяемого random access iterator. Кроме того, iterator_traits<RandomAccessIterator>::value_type должен обозначать беззнаковый целочисленный тип, способный вместить 32-битные величины.
Effects: Ничего не делает, если begin == end. В противном случае, с помощью s=v.size() и n=end−beginзаполняет предоставленный диапазон в [begin,end) соответствии со следующим алгоритмом, в котором каждая операция должна выполняться по модулю 232, каждый примененный оператор индексации begin должен приниматься по модулю nи T(x) определяется как xxor(xrshift27):
a)В качестве инициализации установите значение каждого элемента диапазона 0x8b8b8b8b. Кроме того, для использования на последующих этапах, пусть p=(n−t)/2 и пусть q=p+t, где
t=(n≥623) ? 11 : (n≥68) ? 7 : (n≥39) ? 5 : (n≥7) ? 3 : (n−1)/2;
b)С m как большее из s+1 и nпреобразовать элементы диапазона: итеративно для k=0,…,m−1, вычислить значения
r1=1664525⋅T(begin[k]xorbegin[k+p]xorbegin[k−1])r2=r1+⎧⎪⎨⎪⎩s, k=0kmodn+v[k−1], 0<k≤skmodn, s<k
и, по порядку, увеличить begin[k+p] на r1, увеличить begin[k+q] на r2и установить begin[k] в r2.
c)Снова преобразовать элементы диапазона, начиная с того места, где закончился предыдущий шаг: итеративно для k=m,…,m+n−1, вычислить значения
r3=1566083941⋅T(begin[k]+begin[k+p]+begin[k−1])r4=r3−(kmodn)
и, по порядку, обновить begin[k+p] , зафиксировав его r3, обновить begin[k+q] , зафиксировав его r4, и установить begin[k] в r4.
size_t size() const noexcept;
template<class OutputIterator>
void param(OutputIterator dest) const;
Requires: OutputIterator должны удовлетворять требованиям output iterator. Более того, выражение *dest = rt должно быть действительным для значения rt типа result_type.
Effects: Копирует последовательность подготовленных 32-битных модулей в заданное место назначения, как если бы выполняя следующий оператор:
copy(v.begin(), v.end(), dest);
Каждая функция экземпляр из шаблона , описанный в этом разделе [rand.util.canonical] отображает результат одного или несколько призываний в комплекте поставку равномерного случайного генератора бит g одного из членов указанной RealType таким образом, что, если значения , gi полученные g равномерно распределены, результаты Инстанцирования в tj, 0≤tj<1, распределяются как можно более равномерно, как указано ниже.
[ Note: Получение значения таким образом может быть полезным этапом в процессе преобразования значения, сгенерированного генератором однородных случайных битов, в значение, которое может быть доставлено распределением случайных чисел. ] — end note
template<class RealType, size_t bits, class URBG>
RealType generate_canonical(URBG& g);
Effects: Вызывает g() k время для получения значений g0,…,gk−1соответственно. Рассчитывает количество
S=k−1∑i=0(gi−g.min())⋅Ri
используя арифметику типа RealType.
b вводится, чтобы избежать любых попыток произвести больше битов случайности, чем может быть удержано RealType.
Каждый тип, созданный из шаблона класса, указанного в этом разделе, [rand.dist] удовлетворяет требованиям random number distribution типа.
Описания представлены в этом разделе [rand.dist] только для операций распространения, которые не описаны, [rand.req.dist] или для операций, для которых имеется дополнительная семантическая информация. В частности, объявления для конструкторов копирования, для операторов присваивания копий, для операторов потоковой передачи и для операторов равенства и неравенства не показаны в резюме.
uniform_int_distribution Случайное распределение числа производит случайные целые числа i, a≤i≤b, распределенные в соответствии с постоянной дискретной функцией вероятности
P(i|a,b)=1/(b−a+1).
template<class IntType = int> class uniform_int_distribution { public: // types using result_type = IntType; using param_type = unspecified; // constructors and reset functions explicit uniform_int_distribution(IntType a = 0, IntType b = numeric_limits<IntType>::max()); explicit uniform_int_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions result_type a() const; result_type b() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
explicit uniform_int_distribution(IntType a = 0, IntType b = numeric_limits<IntType>::max());
Effects: Строит uniform_int_distribution объект; a и b соответствуют соответствующим параметрам распределения.
result_type a() const;
result_type b() const;
uniform_real_distribution Случайное распределение числа производит случайные числа x, a≤x<b, распределенные в соответствии с функцией плотности вероятности постоянной
p(x|a,b)=1/(b−a).
[ Note: Это означает, что p(x|a,b) не определено, когда a == b. ] — end note
template<class RealType = double> class uniform_real_distribution { public: // types using result_type = RealType; using param_type = unspecified; // constructors and reset functions explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0); explicit uniform_real_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions result_type a() const; result_type b() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0);
Effects: Строит uniform_real_distribution объект; a и b соответствуют соответствующим параметрам распределения.
result_type a() const;
result_type b() const;
bernoulli_distribution Распределение случайных чисел производит bool значения , b распределенных в соответствии с дискретной вероятностной функцией
P(b|p)={pifb=true1−pifb=false.
class bernoulli_distribution { public: // types using result_type = bool; using param_type = unspecified; // constructors and reset functions explicit bernoulli_distribution(double p = 0.5); explicit bernoulli_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions double p() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
explicit bernoulli_distribution(double p = 0.5);
double p() const;
binomial_distribution Случайное распределение числа производит целые значения i≥0 распределены по дискретной функции вероятности
P(i|t,p)=(ti)⋅pi⋅(1−p)t−i.
template<class IntType = int> class binomial_distribution { public: // types using result_type = IntType; using param_type = unspecified; // constructors and reset functions explicit binomial_distribution(IntType t = 1, double p = 0.5); explicit binomial_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions IntType t() const; double p() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
explicit binomial_distribution(IntType t = 1, double p = 0.5);
Effects: Строит binomial_distribution объект; t и p соответствуют соответствующим параметрам распределения.
IntType t() const;
double p() const;
geometric_distribution Случайное распределение числа производит целые значения i≥0 распределены по дискретной функции вероятности
P(i|p)=p⋅(1−p)i.
template<class IntType = int> class geometric_distribution { public: // types using result_type = IntType; using param_type = unspecified; // constructors and reset functions explicit geometric_distribution(double p = 0.5); explicit geometric_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions double p() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
explicit geometric_distribution(double p = 0.5);
double p() const;
negative_binomial_distribution Случайное распределение числа производит случайные целые числа , i≥0 распределенные в соответствии с дискретной вероятностной функцией
P(i|k,p)=(k+i−1i)⋅pk⋅(1−p)i.
[ Note: Это означает, что P(i|k,p) не определено, когда p == 1. ] — end note
template<class IntType = int> class negative_binomial_distribution { public: // types using result_type = IntType; using param_type = unspecified; // constructor and reset functions explicit negative_binomial_distribution(IntType k = 1, double p = 0.5); explicit negative_binomial_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions IntType k() const; double p() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
explicit negative_binomial_distribution(IntType k = 1, double p = 0.5);
Effects: Строит negative_binomial_distribution объект; k и p соответствуют соответствующим параметрам распределения.
IntType k() const;
double p() const;
poisson_distribution Случайное распределение числа производит целые значения i≥0 распределены по дискретной функции вероятности
P(i|μ)=e−μμii!.
Параметр распределения μ также известен как это распределение . mean
template<class IntType = int> class poisson_distribution { public: // types using result_type = IntType; using param_type = unspecified; // constructors and reset functions explicit poisson_distribution(double mean = 1.0); explicit poisson_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions double mean() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
explicit poisson_distribution(double mean = 1.0);
double mean() const;
exponential_distribution Случайное распределение числа производит случайные числа , x>0 распределенные в соответствии с функцией плотности вероятности
p(x|λ)=λe−λx.
template<class RealType = double> class exponential_distribution { public: // types using result_type = RealType; using param_type = unspecified; // constructors and reset functions explicit exponential_distribution(RealType lambda = 1.0); explicit exponential_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions RealType lambda() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
explicit exponential_distribution(RealType lambda = 1.0);
RealType lambda() const;
gamma_distribution Случайное распределение числа производит случайные числа , x>0 распределенные в соответствии с функцией плотности вероятности
p(x|α,β)=e−x/ββα⋅Γ(α)⋅xα−1.
template<class RealType = double> class gamma_distribution { public: // types using result_type = RealType; using param_type = unspecified; // constructors and reset functions explicit gamma_distribution(RealType alpha = 1.0, RealType beta = 1.0); explicit gamma_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions RealType alpha() const; RealType beta() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
explicit gamma_distribution(RealType alpha = 1.0, RealType beta = 1.0);
RealType alpha() const;
RealType beta() const;
weibull_distribution Случайное распределение числа производит случайные числа , x≥0 распределенные в соответствии с функцией плотности вероятности
p(x|a,b)=ab⋅(xb)a−1⋅exp(−(xb)a).
template<class RealType = double> class weibull_distribution { public: // types using result_type = RealType; using param_type = unspecified; // constructor and reset functions explicit weibull_distribution(RealType a = 1.0, RealType b = 1.0); explicit weibull_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions RealType a() const; RealType b() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
explicit weibull_distribution(RealType a = 1.0, RealType b = 1.0);
Effects: Строит weibull_distribution объект; a и b соответствуют соответствующим параметрам распределения.
RealType a() const;
RealType b() const;
extreme_value_distribution Случайное распределение числа производит случайные числа , x распределенные в соответствии с функцией плотности вероятности274
p(x|a,b)=1b⋅exp(a−xb−exp(a−xb)).
template<class RealType = double> class extreme_value_distribution { public: // types using result_type = RealType; using param_type = unspecified; // constructor and reset functions explicit extreme_value_distribution(RealType a = 0.0, RealType b = 1.0); explicit extreme_value_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions RealType a() const; RealType b() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
explicit extreme_value_distribution(RealType a = 0.0, RealType b = 1.0);
Effects: Создает extreme_value_distribution объект; a и b соответствуют соответствующим параметрам распределения.
RealType a() const;
RealType b() const;
Распределение, соответствующее этой функции плотности вероятности, также известно (с возможным изменением переменной) как распределение Гамбеля типа I, лог-Вейбулла или распределение Фишера-Типпетта типа I.
normal_distribution Случайное распределение числа производит случайные числа , x распределенные в соответствии с функцией плотности вероятности
p(x|μ,σ)=1σ√2π⋅exp(−(x−μ)22σ2).
Параметры распределения μ и σ также известны как этого распределения и . mean standard deviation
template<class RealType = double> class normal_distribution { public: // types using result_type = RealType; using param_type = unspecified; // constructors and reset functions explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0); explicit normal_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions RealType mean() const; RealType stddev() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0);
Effects: Строит normal_distribution объект; mean и stddev соответствуют соответствующим параметрам распределения.
RealType mean() const;
RealType stddev() const;
lognormal_distribution Случайное распределение числа производит случайные числа , x>0 распределенные в соответствии с функцией плотности вероятности
p(x|m,s)=1sx√2π⋅exp(−(lnx−m)22s2).
template<class RealType = double> class lognormal_distribution { public: // types using result_type = RealType; using param_type = unspecified; // constructor and reset functions explicit lognormal_distribution(RealType m = 0.0, RealType s = 1.0); explicit lognormal_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions RealType m() const; RealType s() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
explicit lognormal_distribution(RealType m = 0.0, RealType s = 1.0);
Effects: Строит lognormal_distribution объект; m и s соответствуют соответствующим параметрам распределения.
RealType m() const;
RealType s() const;
chi_squared_distribution Случайное распределение числа производит случайные числа , x>0 распределенные в соответствии с функцией плотности вероятности
p(x|n)=x(n/2)−1⋅e−x/2Γ(n/2)⋅2n/2.
template<class RealType = double> class chi_squared_distribution { public: // types using result_type = RealType; using param_type = unspecified; // constructor and reset functions explicit chi_squared_distribution(RealType n = 1); explicit chi_squared_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions RealType n() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
explicit chi_squared_distribution(RealType n = 1);
RealType n() const;
cauchy_distribution Случайное распределение числа производит случайные числа , x распределенные в соответствии с функцией плотности вероятности
p(x|a,b)=(πb(1+(x−ab)2))−1.
template<class RealType = double> class cauchy_distribution { public: // types using result_type = RealType; using param_type = unspecified; // constructor and reset functions explicit cauchy_distribution(RealType a = 0.0, RealType b = 1.0); explicit cauchy_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions RealType a() const; RealType b() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
explicit cauchy_distribution(RealType a = 0.0, RealType b = 1.0);
Effects: Строит cauchy_distribution объект; a и b соответствуют соответствующим параметрам распределения.
RealType a() const;
RealType b() const;
fisher_f_distribution Случайное распределение числа производит случайные числа , x≥0 распределенные в соответствии с функцией плотности вероятности
p(x|m,n)=Γ((m+n)/2)Γ(m/2)Γ(n/2)⋅(mn)m/2⋅x(m/2)−1⋅(1+mxn)−(m+n)/2.
template<class RealType = double> class fisher_f_distribution { public: // types using result_type = RealType; using param_type = unspecified; // constructor and reset functions explicit fisher_f_distribution(RealType m = 1, RealType n = 1); explicit fisher_f_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions RealType m() const; RealType n() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
explicit fisher_f_distribution(RealType m = 1, RealType n = 1);
Effects: Строит fisher_f_distribution объект; m и n соответствуют соответствующим параметрам распределения.
RealType m() const;
RealType n() const;
student_t_distribution Случайное распределение числа производит случайные числа , x распределенные в соответствии с функцией плотности вероятности
p(x|n)=1√nπ⋅Γ((n+1)/2)Γ(n/2)⋅(1+x2n)−(n+1)/2.
template<class RealType = double> class student_t_distribution { public: // types using result_type = RealType; using param_type = unspecified; // constructor and reset functions explicit student_t_distribution(RealType n = 1); explicit student_t_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions RealType n() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
explicit student_t_distribution(RealType n = 1);
RealType n() const;
discrete_distribution Случайное распределение числа производит случайные целые числа i, 0≤i<n, распределенных в соответствии с дискретной вероятностной функции
P(i|p0,…,pn−1)=pi.
Если не указано иное, параметры распределения рассчитываются как:, pk=wk/S for k=0,…,n−1 в котором значения wk, обычно известные как , должны быть неотрицательными, отличными от NaN и бесконечными. Кроме того, соотношение должно занимать: . weights 0<S=w0+⋯+wn−1
template<class IntType = int> class discrete_distribution { public: // types using result_type = IntType; using param_type = unspecified; // constructor and reset functions discrete_distribution(); template<class InputIterator> discrete_distribution(InputIterator firstW, InputIterator lastW); discrete_distribution(initializer_list<double> wl); template<class UnaryOperation> discrete_distribution(size_t nw, double xmin, double xmax, UnaryOperation fw); explicit discrete_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions vector<double> probabilities() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
discrete_distribution();
Effects: Создает discrete_distribution объект с помощью n=1 и p0=1. [ Note: Такой объект всегда будет иметь ценность 0. ] — end note
template<class InputIterator>
discrete_distribution(InputIterator firstW, InputIterator lastW);
Requires: InputIterator должны удовлетворять требованиям input iterator. Кроме того, iterator_traits<InputIterator>::value_type будет обозначать тип, в который можно преобразовать double. Если firstW == lastW, пусть n=1 и w0=1. В противном случае [firstW,lastW) формируется последовательность w длины n>0.
discrete_distribution(initializer_list<double> wl);
template<class UnaryOperation>
discrete_distribution(size_t nw, double xmin, double xmax, UnaryOperation fw);
Requires: Каждый экземпляр типа UnaryOperation должен быть function object типом возвращаемого значения, в который можно преобразовать double. Более того, double должен быть преобразован в тип UnaryOperationединственного параметра. Если nw=0, пусть n=1, иначе пусть n=nw. Отношение 0<δ=(xmax−xmin)/n должно сохраняться.
Effects: Создает discrete_distribution объект с вероятностями, заданными формулой выше, используя следующие значения: Если nw=0, пусть w0=1. В противном случае пусть wk=fw(xmin+k⋅δ+δ/2) для k=0,…,n−1.
vector<double> probabilities() const;
piecewise_constant_distribution Случайное распределение числа производит случайные числа x, b0≤x<bnравномерно распределяется по каждому подинтервалу в [bi,bi+1) соответствии с функцией плотности вероятности
p(x|b0,…,bn,ρ0,…,ρn−1)=ρi, for bi≤x<bi+1.
Параметры n+1 распределения bi, также известные как это распределение , должны удовлетворять соотношению для . Если не указано иное, остальные параметры распределения рассчитываются как: interval boundaries bi<bi+1 i=0,…,n−1 n
ρk=wkS⋅(bk+1−bk) for k=0,…,n−1,
в котором значения wk, обычно известные как the , должны быть неотрицательными, отличными от NaN и бесконечными. Кроме того, соотношение должно занимать: . weights 0<S=w0+⋯+wn−1
template<class RealType = double> class piecewise_constant_distribution { public: // types using result_type = RealType; using param_type = unspecified; // constructor and reset functions piecewise_constant_distribution(); template<class InputIteratorB, class InputIteratorW> piecewise_constant_distribution(InputIteratorB firstB, InputIteratorB lastB, InputIteratorW firstW); template<class UnaryOperation> piecewise_constant_distribution(initializer_list<RealType> bl, UnaryOperation fw); template<class UnaryOperation> piecewise_constant_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw); explicit piecewise_constant_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions vector<result_type> intervals() const; vector<result_type> densities() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
piecewise_constant_distribution();
template<class InputIteratorB, class InputIteratorW>
piecewise_constant_distribution(InputIteratorB firstB, InputIteratorB lastB,
InputIteratorW firstW);
Requires: InputIteratorB и InputIteratorW каждый должен удовлетворять требованиям своего input iterator типа. Кроме того, каждый iterator_traits<InputIteratorB>::value_type и iterator_traits<InputIteratorW>::value_typeдолжен обозначать тип, в который можно преобразовать double. Если firstB == lastB или ++firstB == lastB, пусть n=1, w0=1, b0=0и b1=1. В противном случае [firstB,lastB) должен формировать последовательность b длины n+1, длина последовательности, w начиная с, firstW должна быть не менее n, и любое значение wk for k≥n должно игнорироваться распределением.
template<class UnaryOperation>
piecewise_constant_distribution(initializer_list<RealType> bl, UnaryOperation fw);
Requires: Каждый экземпляр типа UnaryOperation должен быть function object типом возвращаемого значения, в который можно преобразовать double. Более того, double должен быть преобразован в тип UnaryOperationединственного параметра.
Effects: Создает piecewise_constant_distribution объект с параметрами , принятых или вычисленных из следующих значений: Если bl.size()<2, пусть n=1, w0=1, b0=0и b1=1. В противном случае позвольте [bl.begin(),bl.end()) сформировать последовательность b0,…,bnи позвольте wk=fw((bk+1+bk)/2) для k=0,…,n−1.
template<class UnaryOperation>
piecewise_constant_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw);
Requires: Каждый экземпляр типа UnaryOperation должен быть function object типом возвращаемого значения, в который можно преобразовать double. Более того, double должен быть преобразован в тип UnaryOperationединственного параметра. Если nw=0, пусть n=1, иначе пусть n=nw. Отношение 0<δ=(xmax−xmin)/n должно сохраняться.
Effects: Создает piecewise_constant_distribution объект с параметрами, взятыми или вычисленными из следующих значений: Let bk=xmin+k⋅δ for k=0,…,nи wk=fw(bk+δ/2) for k=0,…,n−1.
vector<result_type> intervals() const;
Returns: Объект vector<result_type> , size член которого возвращается n+1 и operator[] член которого возвращается bk при вызове с аргументом k for k=0,…,n.
vector<result_type> densities() const;
piecewise_linear_distribution Случайное распределение числа производит случайные числа x, b0≤x<bn, распределяется по каждому подинтервалу в [bi,bi+1) соответствии с функцией плотности вероятности
p(x|b0,…,bn,ρ0,…,ρn)=ρi⋅bi+1−xbi+1−bi+ρi+1⋅x−bibi+1−bi, for bi≤x<bi+1.
Параметры n+1 распределения bi, также известные как это распределение , должны удовлетворять соотношению для . Если не указано иное, остальные параметры распределения вычисляются как , в котором значения , обычно известные как , должны быть неотрицательными, отличными от NaN и бесконечными. Кроме того, должно выполняться следующее соотношение: interval boundaries bi<bi+1 i=0,…,n−1 n+1 ρk=wk/S for k=0,…,n wk weights at boundaries
0<S=12⋅n−1∑k=0(wk+wk+1)⋅(bk+1−bk).
template<class RealType = double> class piecewise_linear_distribution { public: // types using result_type = RealType; using param_type = unspecified; // constructor and reset functions piecewise_linear_distribution(); template<class InputIteratorB, class InputIteratorW> piecewise_linear_distribution(InputIteratorB firstB, InputIteratorB lastB, InputIteratorW firstW); template<class UnaryOperation> piecewise_linear_distribution(initializer_list<RealType> bl, UnaryOperation fw); template<class UnaryOperation> piecewise_linear_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw); explicit piecewise_linear_distribution(const param_type& parm); void reset(); // generating functions template<class URBG> result_type operator()(URBG& g); template<class URBG> result_type operator()(URBG& g, const param_type& parm); // property functions vector<result_type> intervals() const; vector<result_type> densities() const; param_type param() const; void param(const param_type& parm); result_type min() const; result_type max() const; };
piecewise_linear_distribution();
template<class InputIteratorB, class InputIteratorW>
piecewise_linear_distribution(InputIteratorB firstB, InputIteratorB lastB,
InputIteratorW firstW);
Requires: InputIteratorB и InputIteratorW каждый должен удовлетворять требованиям своего input iterator типа. Кроме того, каждый iterator_traits<InputIteratorB>::value_type и iterator_traits<InputIteratorW>::value_typeдолжен обозначать тип, в который можно преобразовать double. Если firstB == lastB или ++firstB == lastB, пусть n=1, ρ0=ρ1=1, b0=0и b1=1. В противном случае [firstB,lastB) должен формировать последовательность b длины n+1, длина последовательности, w начиная с, firstW должна быть не менее n+1, и любое значение wk for k≥n+1 должно игнорироваться распределением.
template<class UnaryOperation>
piecewise_linear_distribution(initializer_list<RealType> bl, UnaryOperation fw);
Requires: Каждый экземпляр типа UnaryOperation должен быть function object типом возвращаемого значения, в который можно преобразовать double. Более того, double должен быть преобразован в тип UnaryOperationединственного параметра.
Effects: Создает piecewise_linear_distribution объект с параметрами , принятых или вычисленных из следующих значений: Если bl.size()<2, пусть n=1, ρ0=ρ1=1, b0=0и b1=1. В противном случае позвольте [bl.begin(),bl.end()) сформировать последовательность b0,…,bnи позвольте wk=fw(bk) для k=0,…,n.
template<class UnaryOperation>
piecewise_linear_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw);
Requires: Каждый экземпляр типа UnaryOperation должен быть function object типом возвращаемого значения, в который можно преобразовать double. Более того, double должен быть преобразован в тип UnaryOperationединственного параметра. Если nw=0, пусть n=1, иначе пусть n=nw. Отношение 0<δ=(xmax−xmin)/n должно сохраняться.
Effects: Создает piecewise_linear_distribution объект с параметрами, взятыми или вычисленными из следующих значений: Let bk=xmin+k⋅δ for k=0,…,nи wk=fw(bk) for k=0,…,n.
vector<result_type> intervals() const;
Returns: Объект vector<result_type> , size член которого возвращается n+1 и operator[] член которого возвращается bk при вызове с аргументом k for k=0,…,n.
vector<result_type> densities() const;
int rand();
void srand(unsigned int seed);
Remarks: Реализация может указывать, что могут вызывать определенные библиотечные функции rand. Это определяется реализацией, rand может ли функция вводить данные races ( [res.on.data.races]). [ Другие средства генерации случайных чисел в этом международном стандарте ( ) часто предпочтительнее , потому что лежащий в основе алгоритм не определен. Поэтому использование по- прежнему непереносимо, с непредсказуемым и часто сомнительным качеством и производительностью. ] Note: [rand] rand rand rand — end note
См. Также: ISO C 7.22.2
#include <initializer_list> namespace std { template<class T> class valarray; // An array of type T class slice; // a BLAS-like slice out of an array template<class T> class slice_array; class gslice; // a generalized slice out of an array template<class T> class gslice_array; template<class T> class mask_array; // a masked array template<class T> class indirect_array; // an indirected array template<class T> void swap(valarray<T>&, valarray<T>&) noexcept; template<class T> valarray<T> operator* (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator* (const valarray<T>&, const T&); template<class T> valarray<T> operator* (const T&, const valarray<T>&); template<class T> valarray<T> operator/ (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator/ (const valarray<T>&, const T&); template<class T> valarray<T> operator/ (const T&, const valarray<T>&); template<class T> valarray<T> operator% (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator% (const valarray<T>&, const T&); template<class T> valarray<T> operator% (const T&, const valarray<T>&); template<class T> valarray<T> operator+ (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator+ (const valarray<T>&, const T&); template<class T> valarray<T> operator+ (const T&, const valarray<T>&); template<class T> valarray<T> operator- (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator- (const valarray<T>&, const T&); template<class T> valarray<T> operator- (const T&, const valarray<T>&); template<class T> valarray<T> operator^ (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator^ (const valarray<T>&, const T&); template<class T> valarray<T> operator^ (const T&, const valarray<T>&); template<class T> valarray<T> operator& (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator& (const valarray<T>&, const T&); template<class T> valarray<T> operator& (const T&, const valarray<T>&); template<class T> valarray<T> operator| (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator| (const valarray<T>&, const T&); template<class T> valarray<T> operator| (const T&, const valarray<T>&); template<class T> valarray<T> operator<<(const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator<<(const valarray<T>&, const T&); template<class T> valarray<T> operator<<(const T&, const valarray<T>&); template<class T> valarray<T> operator>>(const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator>>(const valarray<T>&, const T&); template<class T> valarray<T> operator>>(const T&, const valarray<T>&); template<class T> valarray<bool> operator&&(const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator&&(const valarray<T>&, const T&); template<class T> valarray<bool> operator&&(const T&, const valarray<T>&); template<class T> valarray<bool> operator||(const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator||(const valarray<T>&, const T&); template<class T> valarray<bool> operator||(const T&, const valarray<T>&); template<class T> valarray<bool> operator==(const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator==(const valarray<T>&, const T&); template<class T> valarray<bool> operator==(const T&, const valarray<T>&); template<class T> valarray<bool> operator!=(const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator!=(const valarray<T>&, const T&); template<class T> valarray<bool> operator!=(const T&, const valarray<T>&); template<class T> valarray<bool> operator< (const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator< (const valarray<T>&, const T&); template<class T> valarray<bool> operator< (const T&, const valarray<T>&); template<class T> valarray<bool> operator> (const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator> (const valarray<T>&, const T&); template<class T> valarray<bool> operator> (const T&, const valarray<T>&); template<class T> valarray<bool> operator<=(const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator<=(const valarray<T>&, const T&); template<class T> valarray<bool> operator<=(const T&, const valarray<T>&); template<class T> valarray<bool> operator>=(const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator>=(const valarray<T>&, const T&); template<class T> valarray<bool> operator>=(const T&, const valarray<T>&); template<class T> valarray<T> abs (const valarray<T>&); template<class T> valarray<T> acos (const valarray<T>&); template<class T> valarray<T> asin (const valarray<T>&); template<class T> valarray<T> atan (const valarray<T>&); template<class T> valarray<T> atan2(const valarray<T>&, const valarray<T>&); template<class T> valarray<T> atan2(const valarray<T>&, const T&); template<class T> valarray<T> atan2(const T&, const valarray<T>&); template<class T> valarray<T> cos (const valarray<T>&); template<class T> valarray<T> cosh (const valarray<T>&); template<class T> valarray<T> exp (const valarray<T>&); template<class T> valarray<T> log (const valarray<T>&); template<class T> valarray<T> log10(const valarray<T>&); template<class T> valarray<T> pow(const valarray<T>&, const valarray<T>&); template<class T> valarray<T> pow(const valarray<T>&, const T&); template<class T> valarray<T> pow(const T&, const valarray<T>&); template<class T> valarray<T> sin (const valarray<T>&); template<class T> valarray<T> sinh (const valarray<T>&); template<class T> valarray<T> sqrt (const valarray<T>&); template<class T> valarray<T> tan (const valarray<T>&); template<class T> valarray<T> tanh (const valarray<T>&); template <class T> unspecified1 begin(valarray<T>& v); template <class T> unspecified2 begin(const valarray<T>& v); template <class T> unspecified1 end(valarray<T>& v); template <class T> unspecified2 end(const valarray<T>& v); }
Заголовка <valarray> определяет пять шаблонов классов ( valarray, slice_array, gslice_array, mask_array, и indirect_array), два класса ( slice и gslice), а также ряд связанных шаблонов функций для представления и манипулирования массивов значений.
Эти valarray классы массива определяется так, чтобы быть свободными от определенных форм наложения спектров, таким образом позволяя операции на этих классах должны быть оптимизированы.
Любая функция, возвращающая a, valarray<T> может возвращать объект другого типа при условии, что все константные функции-члены valarray<T> также применимы к этому типу. Этот возвращаемый тип не должен добавлять более двух уровней вложенности шаблона по наиболее глубоко вложенному типу аргумента.275
Реализации, вводящие такие типы замены, должны предоставлять следующие дополнительные функции и операторы:
для каждой функции, принимающей const valarray<T>& отличные от begin и end, должны быть добавлены идентичные функции, принимающие типы замены;
для каждой функции, принимающей два const valarray<T>& аргумента, const valarray<T>& должны быть добавлены идентичные функции, принимающие все комбинации и типы замены.
В частности, реализация должна позволить valarray<T> быть построена из таких типов замены и должен допускать назначения и сложных задания таких типов в valarray<T>, slice_array<T>, gslice_array<T>, mask_array<T> и indirect_array<T> объектах.
Этим библиотечным функциям разрешено генерировать bad_alloc исключение, если для выполнения операции недостаточно ресурсов. Обратите внимание, что исключение не является обязательным.
Приложение [implimits] рекомендует минимальное количество рекурсивно вложенных экземпляров шаблона. Таким образом, это требование косвенно предполагает минимально допустимую сложность для выражений valarray.
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: Создает a valarray , имеющий длину n. Каждый элемент массива равен value-initialized.
valarray(const T& v, size_t n);
Effects: Создает a valarray , имеющий длину n. Каждый элемент массива инициализируется с помощью v.
valarray(const T* p, size_t n);
Requires: p указывает на array ( [dcl.array]) как минимум из n элементов.
Effects: Создает a valarray , имеющий длину n. Значения элементов массива инициализируются первыми n значениями, на которые указывает первый аргумент.278
valarray(const valarray& v);
valarray(valarray&& v) noexcept;
Effects: Создает a valarray , имеющий ту же длину, что и 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: A valarray длины size(), каждый из элементов которого I равен (*this)[I + n] if I + n , неотрицателен и меньше size(), в противном случае T(). [ Note: Если нулевой элемент выбран как крайний левый элемент, положительное значение n сдвигает элементы влево n с нулевым заполнением. ] — end note
[ Example: Если аргумент имеет значение -2, первые два элемента результата будут value-initialized; третьему элементу результата будет присвоено значение первого элемента аргумента; и т. д. ] — end example
valarray cshift(int n) const;
Returns: A valarray длины, size() которая представляет собой круговое смещение на *this. Если нулевой элемент выбран как крайний левый элемент, неотрицательное значение n сдвигает элементы по кругу влево, n а отрицательное значение n сдвигает элементы по кругу вправо −n .
valarray apply(T func(T)) const;
valarray apply(T func(const T&)) const;
Returns: A valarray , длина которого равна size(). Каждому элементу возвращенного массива присваивается значение, возвращаемое путем применения функции аргумента к соответствующему элементу *this.
void resize(size_t sz, T c = T());
template<class T> valarray<T> operator*
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator/
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator%
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator+
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator-
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator^
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator&
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator|
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator<<
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator>>
(const valarray<T>&, const valarray<T>&);
Requires: Каждый из этих операторов может быть создан только для типа, T к которому может применяться указанный оператор и для которого указанный оператор возвращает значение типа T или которое может быть однозначно неявно преобразовано в тип T. Массивы аргументов имеют одинаковую длину.
Returns: A valarray , длина которого равна длинам массивов аргументов. Каждый элемент возвращаемого массива инициализируется результатом применения указанного оператора к соответствующим элементам массивов аргументов.
template<class T> valarray<T> operator* (const valarray<T>&, const T&);
template<class T> valarray<T> operator* (const T&, const valarray<T>&);
template<class T> valarray<T> operator/ (const valarray<T>&, const T&);
template<class T> valarray<T> operator/ (const T&, const valarray<T>&);
template<class T> valarray<T> operator% (const valarray<T>&, const T&);
template<class T> valarray<T> operator% (const T&, const valarray<T>&);
template<class T> valarray<T> operator+ (const valarray<T>&, const T&);
template<class T> valarray<T> operator+ (const T&, const valarray<T>&);
template<class T> valarray<T> operator- (const valarray<T>&, const T&);
template<class T> valarray<T> operator- (const T&, const valarray<T>&);
template<class T> valarray<T> operator^ (const valarray<T>&, const T&);
template<class T> valarray<T> operator^ (const T&, const valarray<T>&);
template<class T> valarray<T> operator& (const valarray<T>&, const T&);
template<class T> valarray<T> operator& (const T&, const valarray<T>&);
template<class T> valarray<T> operator| (const valarray<T>&, const T&);
template<class T> valarray<T> operator| (const T&, const valarray<T>&);
template<class T> valarray<T> operator<<(const valarray<T>&, const T&);
template<class T> valarray<T> operator<<(const T&, const valarray<T>&);
template<class T> valarray<T> operator>>(const valarray<T>&, const T&);
template<class T> valarray<T> operator>>(const T&, const valarray<T>&);
Requires: Каждый из этих операторов может быть создан только для типа, T к которому может применяться указанный оператор и для которого указанный оператор возвращает значение типа T или которое может быть однозначно неявно преобразовано в тип T.
template<class T> valarray<bool> operator==
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<bool> operator!=
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<bool> operator<
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<bool> operator>
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<bool> operator<=
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<bool> operator>=
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<bool> operator&&
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<bool> operator||
(const valarray<T>&, const valarray<T>&);
Returns: A valarray<bool> , длина которого равна длине аргументов массива. Каждый элемент возвращаемого массива инициализируется результатом применения указанного оператора к соответствующим элементам массивов аргументов.
template<class T> valarray<bool> operator==(const valarray<T>&, const T&);
template<class T> valarray<bool> operator==(const T&, const valarray<T>&);
template<class T> valarray<bool> operator!=(const valarray<T>&, const T&);
template<class T> valarray<bool> operator!=(const T&, const valarray<T>&);
template<class T> valarray<bool> operator< (const valarray<T>&, const T&);
template<class T> valarray<bool> operator< (const T&, const valarray<T>&);
template<class T> valarray<bool> operator> (const valarray<T>&, const T&);
template<class T> valarray<bool> operator> (const T&, const valarray<T>&);
template<class T> valarray<bool> operator<=(const valarray<T>&, const T&);
template<class T> valarray<bool> operator<=(const T&, const valarray<T>&);
template<class T> valarray<bool> operator>=(const valarray<T>&, const T&);
template<class T> valarray<bool> operator>=(const T&, const valarray<T>&);
template<class T> valarray<bool> operator&&(const valarray<T>&, const T&);
template<class T> valarray<bool> operator&&(const T&, const valarray<T>&);
template<class T> valarray<bool> operator||(const valarray<T>&, const T&);
template<class T> valarray<bool> operator||(const T&, const valarray<T>&);
Requires: Каждый из этих операторов может быть создан только для типа, T к которому может применяться указанный оператор и для которого указанный оператор возвращает значение типа bool или которое может быть однозначно неявно преобразовано в тип bool.
template<class T> valarray<T> abs (const valarray<T>&);
template<class T> valarray<T> acos (const valarray<T>&);
template<class T> valarray<T> asin (const valarray<T>&);
template<class T> valarray<T> atan (const valarray<T>&);
template<class T> valarray<T> atan2
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> atan2(const valarray<T>&, const T&);
template<class T> valarray<T> atan2(const T&, const valarray<T>&);
template<class T> valarray<T> cos (const valarray<T>&);
template<class T> valarray<T> cosh (const valarray<T>&);
template<class T> valarray<T> exp (const valarray<T>&);
template<class T> valarray<T> log (const valarray<T>&);
template<class T> valarray<T> log10(const valarray<T>&);
template<class T> valarray<T> pow
(const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> pow (const valarray<T>&, const T&);
template<class T> valarray<T> pow (const T&, const valarray<T>&);
template<class T> valarray<T> sin (const valarray<T>&);
template<class T> valarray<T> sinh (const valarray<T>&);
template<class T> valarray<T> sqrt (const valarray<T>&);
template<class T> valarray<T> tan (const valarray<T>&);
template<class T> valarray<T> tanh (const valarray<T>&);
template <class T> void swap(valarray<T>& x, valarray<T>& y) noexcept;
namespace std { class slice { public: slice(); slice(size_t, size_t, size_t); size_t start() const; size_t size() const; size_t stride() const; }; }
slice Класс представляет BLAS-подобный фрагмент из массива. Такой фрагмент определяется начальным индексом, длиной и шагом.280
BLAS означает, что программы на Basic Linear Algebra Subprograms. C ++ могут создавать экземпляры этого класса. Смотрите, например, Dongarra, Du Кроза, Дафф и Hammerling: A set of Level 3 Basic Linear Algebra Subprograms; Технический отчет MCS-P1-0888, Аргоннская национальная лаборатория (США), Отдел математики и информатики, август 1988 г.
slice();
slice(size_t start, size_t length, size_t stride);
slice(const slice&);
Конструктор по умолчанию эквивалентен slice(0, 0, 0). Конструктор по умолчанию предоставляется только для того, чтобы разрешить объявление массивов срезов. Конструктор с аргументами для среза принимает параметры начала, длины и шага.
namespace std {
template <class T> class slice_array {
public:
using value_type = T;
void operator= (const valarray<T>&) const;
void operator*= (const valarray<T>&) const;
void operator/= (const valarray<T>&) const;
void operator%= (const valarray<T>&) const;
void operator+= (const valarray<T>&) const;
void operator-= (const valarray<T>&) const;
void operator^= (const valarray<T>&) const;
void operator&= (const valarray<T>&) const;
void operator|= (const valarray<T>&) const;
void operator<<=(const valarray<T>&) const;
void operator>>=(const valarray<T>&) const;
slice_array(const slice_array&);
~slice_array();
const slice_array& operator=(const slice_array&) const;
void operator=(const T&) const;
slice_array() = delete; // as implied by declaring copy constructor above
};
}
slice_array Шаблон представляет собой шаблон помощника , используемый slice индекс оператора
slice_array<T> valarray<T>::operator[](slice);
Он имеет ссылочную семантику на подмножество массива, указанного slice объектом.
void operator=(const valarray<T>&) const;
const slice_array& operator=(const slice_array&) const;
void operator*= (const valarray<T>&) const;
void operator/= (const valarray<T>&) const;
void operator%= (const valarray<T>&) const;
void operator+= (const valarray<T>&) const;
void operator-= (const valarray<T>&) const;
void operator^= (const valarray<T>&) const;
void operator&= (const valarray<T>&) const;
void operator|= (const valarray<T>&) const;
void operator<<=(const valarray<T>&) const;
void operator>>=(const valarray<T>&) const;
void operator=(const T&) const;
namespace std { class gslice { public: gslice(); gslice(size_t s, const valarray<size_t>& l, const valarray<size_t>& d); size_t start() const; valarray<size_t> size() const; valarray<size_t> stride() const; }; }
Этот класс представляет собой обобщенный фрагмент массива. A gslice определяется начальным смещением ( s), набором длин ( lj) и набором шагов ( dj). Количество длин должно быть равно количеству шагов.
A gslice представляет собой отображение набора индексов ( ij), количество которых равно количеству шагов, в один индекс k. Это полезно для построения классов многомерных массивов с использованием valarray одномерного шаблона. Набор значений одномерных индексов, заданных a gslice :
k=s+∑jijdj
где многомерные индексы ij имеют значения от 0 до lij−1.
[ Спецификация Example: gslice
start = 3 length = {2, 4, 3} stride = {19, 4, 1}
дает последовательность одномерных индексов
k=3+(0,1)×19+(0,1,2,3)×4+(0,1,2)×1
которые упорядочены, как показано в следующей таблице:
(i0,i1,i2,k)= (0,0,0, 3), (0,0,1, 4), (0,0,2, 5), (0,1,0, 7), (0,1,1, 8), (0,1,2, 9), (0,2,0,11), (0,2,1,12), (0,2,2,13), (0,3,0,15), (0,3,1,16), (0,3,2,17), (1,0,0,22), (1,0,1,23), … (1,3,2,36)
То есть индекс с самым высоким порядком получается быстрее всего. ] — end example
[ Example: Если параметры шага в предыдущем примере изменить на {1, 1, 1}, первые несколько элементов результирующей последовательности индексов будут
(0,0,0, 3), (0,0,1, 4), (0,0,2, 5), (0,1,0, 4), (0,1,1, 5), (0,1,2, 6), …
— end example ]
gslice();
gslice(size_t start, const valarray<size_t>& lengths,
const valarray<size_t>& strides);
gslice(const gslice&);
namespace std {
template <class T> class gslice_array {
public:
using value_type = T;
void operator= (const valarray<T>&) const;
void operator*= (const valarray<T>&) const;
void operator/= (const valarray<T>&) const;
void operator%= (const valarray<T>&) const;
void operator+= (const valarray<T>&) const;
void operator-= (const valarray<T>&) const;
void operator^= (const valarray<T>&) const;
void operator&= (const valarray<T>&) const;
void operator|= (const valarray<T>&) const;
void operator<<=(const valarray<T>&) const;
void operator>>=(const valarray<T>&) const;
gslice_array(const gslice_array&);
~gslice_array();
const gslice_array& operator=(const gslice_array&) const;
void operator=(const T&) const;
gslice_array() = delete; // as implied by declaring copy constructor above
};
}
gslice_array<T> valarray<T>::operator[](const gslice&);
void operator=(const valarray<T>&) const;
const gslice_array& operator=(const gslice_array&) const;
void operator*= (const valarray<T>&) const;
void operator/= (const valarray<T>&) const;
void operator%= (const valarray<T>&) const;
void operator+= (const valarray<T>&) const;
void operator-= (const valarray<T>&) const;
void operator^= (const valarray<T>&) const;
void operator&= (const valarray<T>&) const;
void operator|= (const valarray<T>&) const;
void operator<<=(const valarray<T>&) const;
void operator>>=(const valarray<T>&) const;
void operator=(const T&) const;
namespace std {
template <class T> class mask_array {
public:
using value_type = T;
void operator= (const valarray<T>&) const;
void operator*= (const valarray<T>&) const;
void operator/= (const valarray<T>&) const;
void operator%= (const valarray<T>&) const;
void operator+= (const valarray<T>&) const;
void operator-= (const valarray<T>&) const;
void operator^= (const valarray<T>&) const;
void operator&= (const valarray<T>&) const;
void operator|= (const valarray<T>&) const;
void operator<<=(const valarray<T>&) const;
void operator>>=(const valarray<T>&) const;
mask_array(const mask_array&);
~mask_array();
const mask_array& operator=(const mask_array&) const;
void operator=(const T&) const;
mask_array() = delete; // as implied by declaring copy constructor above
};
}
mask_array<T> valarray<T>::operator[](const valarray<bool>&).
void operator=(const valarray<T>&) const;
const mask_array& operator=(const mask_array&) const;
void operator*= (const valarray<T>&) const;
void operator/= (const valarray<T>&) const;
void operator%= (const valarray<T>&) const;
void operator+= (const valarray<T>&) const;
void operator-= (const valarray<T>&) const;
void operator^= (const valarray<T>&) const;
void operator&= (const valarray<T>&) const;
void operator|= (const valarray<T>&) const;
void operator<<=(const valarray<T>&) const;
void operator>>=(const valarray<T>&) const;
void operator=(const T&) const;
namespace std {
template <class T> class indirect_array {
public:
using value_type = T;
void operator= (const valarray<T>&) const;
void operator*= (const valarray<T>&) const;
void operator/= (const valarray<T>&) const;
void operator%= (const valarray<T>&) const;
void operator+= (const valarray<T>&) const;
void operator-= (const valarray<T>&) const;
void operator^= (const valarray<T>&) const;
void operator&= (const valarray<T>&) const;
void operator|= (const valarray<T>&) const;
void operator<<=(const valarray<T>&) const;
void operator>>=(const valarray<T>&) const;
indirect_array(const indirect_array&);
~indirect_array();
const indirect_array& operator=(const indirect_array&) const;
void operator=(const T&) const;
indirect_array() = delete; // as implied by declaring copy constructor above
};
}
indirect_array<T> valarray<T>::operator[](const valarray<size_t>&).
void operator=(const valarray<T>&) const;
const indirect_array& operator=(const indirect_array&) const;
Эти операторы присваивания имеют ссылочную семантику, присваивая значения элементов массива аргументов выбранным элементам valarray<T> объекта, на который они ссылаются.
void operator*= (const valarray<T>&) const;
void operator/= (const valarray<T>&) const;
void operator%= (const valarray<T>&) const;
void operator+= (const valarray<T>&) const;
void operator-= (const valarray<T>&) const;
void operator^= (const valarray<T>&) const;
void operator&= (const valarray<T>&) const;
void operator|= (const valarray<T>&) const;
void operator<<=(const valarray<T>&) const;
void operator>>=(const valarray<T>&) const;
Эти составные присваивания имеют ссылочную семантику, применяя указанную операцию к элементам массива аргументов и выбранным элементам valarray<T> объекта, на который indirect_array ссылается объект.
void operator=(const T&) const;
В следующих шаблонах функций begin и 1 - это тип, который соответствует требованиям изменяемого объекта , а тип - параметр шаблона . 2 - это тип, который удовлетворяет требованиям константы и, чей параметр является параметром шаблона, а тип - . end unspecified random access iterator contiguous iterator value_type T reference T& unspecified random access iterator contiguous iterator value_type T reference const T&
Итераторы, возвращаемые массивом begin и end для массива, гарантированно действительны до тех пор, пока функция-член не resize(size_t, T) будет вызвана для этого массива или пока не закончится время жизни этого массива, в зависимости от того, что произойдет раньше.
template <class T> unspecified1 begin(valarray<T>& v);
template <class T> unspecified2 begin(const valarray<T>& v);
template <class T> unspecified1 end(valarray<T>& v);
template <class T> unspecified2 end(const valarray<T>& v);
namespace std { // [accumulate], accumulate template <class InputIterator, class T> T accumulate(InputIterator first, InputIterator last, T init); template <class InputIterator, class T, class BinaryOperation> T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op); // [reduce], reduce template<class InputIterator> typename iterator_traits<InputIterator>::value_type reduce(InputIterator first, InputIterator last); template<class InputIterator, class T> T reduce(InputIterator first, InputIterator last, T init); template<class InputIterator, class T, class BinaryOperation> T reduce(InputIterator first, InputIterator last, T init, BinaryOperation binary_op); template<class ExecutionPolicy, class ForwardIterator> typename iterator_traits<ForwardIterator>::value_type reduce(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads] ForwardIterator first, ForwardIterator last); template<class ExecutionPolicy, class ForwardIterator, class T> T reduce(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads] ForwardIterator first, ForwardIterator last, T init); template<class ExecutionPolicy, class ForwardIterator, class T, class BinaryOperation> T reduce(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads] ForwardIterator first, ForwardIterator last, T init, BinaryOperation binary_op); // [inner.product], inner product template <class InputIterator1, class InputIterator2, class T> T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init); template <class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2> T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2); // [transform.reduce], transform reduce template<class InputIterator1, class InputIterator2, class T> T transform_reduce(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init); template<class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2> T transform_reduce(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2); template<class InputIterator, class T, class BinaryOperation, class UnaryOperation> T transform_reduce(InputIterator first, InputIterator last, T init, BinaryOperation binary_op, UnaryOperation unary_op); template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class T> T transform_reduce(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads] ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, T init); template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class T, class BinaryOperation1, class BinaryOperation2> T transform_reduce(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads] ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2); template<class ExecutionPolicy, class ForwardIterator, class T, class BinaryOperation, class UnaryOperation> T transform_reduce(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads] ForwardIterator first, ForwardIterator last, T init, BinaryOperation binary_op, UnaryOperation unary_op); // [partial.sum], partial sum template <class InputIterator, class OutputIterator> OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result); template <class InputIterator, class OutputIterator, class BinaryOperation> OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op); // [exclusive.scan], exclusive scan template<class InputIterator, class OutputIterator, class T> OutputIterator exclusive_scan(InputIterator first, InputIterator last, OutputIterator result, T init); template<class InputIterator, class OutputIterator, class T, class BinaryOperation> OutputIterator exclusive_scan(InputIterator first, InputIterator last, OutputIterator result, T init, BinaryOperation binary_op); template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class T> ForwardIterator2 exclusive_scan(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads] ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result, T init); template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class T, class BinaryOperation> ForwardIterator2 exclusive_scan(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads] ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result, T init, BinaryOperation binary_op); // [inclusive.scan], inclusive scan template<class InputIterator, class OutputIterator> OutputIterator inclusive_scan(InputIterator first, InputIterator last, OutputIterator result); template<class InputIterator, class OutputIterator, class BinaryOperation> OutputIterator inclusive_scan(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op); template<class InputIterator, class OutputIterator, class BinaryOperation, class T> OutputIterator inclusive_scan(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op, T init); template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2> ForwardIterator2 inclusive_scan(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads] ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result); template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryOperation> ForwardIterator2 inclusive_scan(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads] ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result, BinaryOperation binary_op); template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryOperation, class T> ForwardIterator2 inclusive_scan(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads] ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result, BinaryOperation binary_op, T init); // [transform.exclusive.scan], transform exclusive scan template<class InputIterator, class OutputIterator, class T, class BinaryOperation, class UnaryOperation> OutputIterator transform_exclusive_scan(InputIterator first, InputIterator last, OutputIterator result, T init, BinaryOperation binary_op, UnaryOperation unary_op); template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class T, class BinaryOperation, class UnaryOperation> ForwardIterator2 transform_exclusive_scan(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads] ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result, T init, BinaryOperation binary_op, UnaryOperation unary_op); // [transform.inclusive.scan], transform inclusive scan template<class InputIterator, class OutputIterator, class BinaryOperation, class UnaryOperation> OutputIterator transform_inclusive_scan(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op, UnaryOperation unary_op); template<class InputIterator, class OutputIterator, class BinaryOperation, class UnaryOperation, class T> OutputIterator transform_inclusive_scan(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op, UnaryOperation unary_op, T init); template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryOperation, class UnaryOperation> ForwardIterator2 transform_inclusive_scan(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads] ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result, BinaryOperation binary_op, UnaryOperation unary_op); template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryOperation, class UnaryOperation, class T> ForwardIterator2 transform_inclusive_scan(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads] ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result, BinaryOperation binary_op, UnaryOperation unary_op, T init); // [adjacent.difference], adjacent difference template <class InputIterator, class OutputIterator> OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result); template <class InputIterator, class OutputIterator, class BinaryOperation> OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op); template <class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2> ForwardIterator2 adjacent_difference(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads] ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result); template <class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryOperation> ForwardIterator2 adjacent_difference(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads] ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result, BinaryOperation binary_op); // [numeric.iota], iota template <class ForwardIterator, class T> void iota(ForwardIterator first, ForwardIterator last, T value); // [numeric.ops.gcd], greatest common divisor template <class M, class N> constexpr common_type_t<M,N> gcd(M m, N n); // [numeric.ops.lcm], least common multiple template <class M, class N> constexpr common_type_t<M,N> lcm(M m, N n); }
Требования к типам аргументов алгоритмов, которые описаны во введении к пункту, [algorithms] также применимы к следующим алгоритмам.
На протяжении всего этого подпункта, параметры UnaryOperation, BinaryOperation, BinaryOperation1, и BinaryOperation2 используются всякий раз , когда алгоритм ожидает функциональный объект ( [function.objects]).
template <class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T init);
template <class InputIterator, class T, class BinaryOperation>
T accumulate(InputIterator first, InputIterator last, T init,
BinaryOperation binary_op);
Requires: T должны соответствовать требованиям CopyConstructible и CopyAssignable типам. В пределах [first, last], binary_op не должны ни изменять элементы , ни к аннулированию итератора или поддиапазоны.281
Использование полностью замкнутых диапазонов является преднамеренным.
accumulate аналогичен оператору сокращения APL и функции сокращения Common Lisp, но позволяет избежать трудности определения результата сокращения для пустой последовательности, всегда требуя начального значения.
template<class InputIterator>
typename iterator_traits<InputIterator>::value_type
reduce(InputIterator first, InputIterator last);
Effects: Эквивалентен:
return reduce(first, last, typename iterator_traits<InputIterator>::value_type{});
template<class ExecutionPolicy, class ForwardIterator>
typename iterator_traits<ForwardIterator>::value_type
reduce(ExecutionPolicy&& exec,
ForwardIterator first, ForwardIterator last);
Effects: Эквивалентен:
return reduce(std::forward<ExecutionPolicy>(exec), first, last, typename iterator_traits<ForwardIterator>::value_type{});
template<class InputIterator, class T>
T reduce(InputIterator first, InputIterator last, T init);
template<class ExecutionPolicy, class ForwardIterator, class T>
T reduce(ExecutionPolicy&& exec,
ForwardIterator first, ForwardIterator last, T init);
Effects: Эквивалентен:
return reduce(std::forward<ExecutionPolicy>(exec), first, last, init, plus<>());
template<class InputIterator, class T, class BinaryOperation>
T reduce(InputIterator first, InputIterator last, T init,
BinaryOperation binary_op);
template<class ExecutionPolicy, class ForwardIterator, class T, class BinaryOperation>
T reduce(ExecutionPolicy&& exec,
ForwardIterator first, ForwardIterator last, T init,
BinaryOperation binary_op);
Requires:
T будет MoveConstructible (таблица 23).
Все binary_op(init, *first), binary_op(*first, init), binary_op(init, init)и binary_op(*first, *first) должны быть конвертированы в T.
binary_op не должен ни аннулировать итераторы или поддиапазоны, ни изменять элементы в диапазоне [first, last].
template <class InputIterator1, class InputIterator2, class T>
T inner_product(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, T init);
template <class InputIterator1, class InputIterator2, class T,
class BinaryOperation1, class BinaryOperation2>
T inner_product(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, T init,
BinaryOperation1 binary_op1,
BinaryOperation2 binary_op2);
Requires: T должны соответствовать требованиям CopyConstructible и CopyAssignable типам. В диапазонах [first1, last1] и [first2, first2 + (last1 - first1)] binary_op1 и binary_op2 не должны изменять элементы или делать недействительными итераторы или поддиапазоны.283
Effects: Вычисляет свой результат, инициализируя аккумулятор acc начальным значением, init а затем изменяя его с помощью acc = acc + (*i1) * (*i2) или acc = binary_op1(acc, binary_op2(*i1, *i2)) для каждого итератора i1 в диапазоне [first1, last1) и итератора i2 в диапазоне [first2, first2 + (last1 - first1)) по порядку.
Использование полностью замкнутых диапазонов является преднамеренным.
template <class InputIterator1, class InputIterator2, class T>
T transform_reduce(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2,
T init);
template <class ExecutionPolicy,
class ForwardIterator1, class ForwardIterator2, class T>
T transform_reduce(ExecutionPolicy&& exec,
ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2,
T init);
Effects: Эквивалентен:
return transform_reduce(first1, last1, first2, init, plus<>(), multiplies<>());
template <class InputIterator1, class InputIterator2, class T,
class BinaryOperation1, class BinaryOperation2>
T transform_reduce(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2,
T init,
BinaryOperation1 binary_op1,
BinaryOperation2 binary_op2);
template <class ExecutionPolicy,
class ForwardIterator1, class ForwardIterator2, class T,
class BinaryOperation1, class BinaryOperation2>
T transform_reduce(ExecutionPolicy&& exec,
ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2,
T init,
BinaryOperation1 binary_op1,
BinaryOperation2 binary_op2);
Requires:
T будет MoveConstructible (таблица 23).
Все
binary_op1(init, init),
binary_op1(init, binary_op2(*first1, *first2)),
binary_op1(binary_op2(*first1, *first2), init), а также
binary_op1(binary_op2(*first1, *first2), binary_op2(*first1, *first2))
конвертируется в T.
Ни и binary_op1 не binary_op2 должны аннулировать поддиапазоны или изменять элементы в диапазонах [first1, last1] и [first2, first2 + (last1 - first1)].
Returns:
GENERALIZED_SUM(binary_op1, init, binary_op2(*i, *(first2 + (i - first1))), ...)
для каждого итератора i в [first1, last1).
template<class InputIterator, class T,
class BinaryOperation, class UnaryOperation>
T transform_reduce(InputIterator first, InputIterator last, T init,
BinaryOperation binary_op, UnaryOperation unary_op);
template<class ExecutionPolicy,
class ForwardIterator, class T,
class BinaryOperation, class UnaryOperation>
T transform_reduce(ExecutionPolicy&& exec,
ForwardIterator first, ForwardIterator last,
T init, BinaryOperation binary_op, UnaryOperation unary_op);
Requires:
T будет MoveConstructible (таблица 23).
Все
binary_op(init, init),
binary_op(init, unary_op(*first)),
binary_op(unary_op(*first), init), а также
binary_op(unary_op(*first), unary_op(*first))
конвертируется в T.
Ни и unary_op не binary_op должно аннулировать поддиапазоны или изменять элементы в диапазоне [first, last].
Returns:
GENERALIZED_SUM(binary_op, init, unary_op(*i), ...)
для каждого итератора i в [first, last).
template <class InputIterator, class OutputIterator>
OutputIterator partial_sum(
InputIterator first, InputIterator last,
OutputIterator result);
template <class InputIterator, class OutputIterator, class BinaryOperation>
OutputIterator partial_sum(
InputIterator first, InputIterator last,
OutputIterator result, BinaryOperation binary_op);
Requires: InputIteratorТип значения должен быть сконструирован из типа *first. Результат выражения acc + *i или binary_op(acc, *i) должен быть неявно преобразован в InputIteratorтип значения. acc должен быть writable к result итератору вывода. В диапазонах [first, last] и [result, result + (last - first)] binary_op не должен изменять элементы или делать недействительными итераторы или поддиапазоны.284
Effects: Для непустого диапазона функция создает аккумулятор acc , тип которого является InputIteratorтипом значения, инициализирует его *firstи присваивает результат *result. Для каждого итератора i по [first + 1, last) порядку acc затем модифицируется с помощью acc = acc + *i или, acc = binary_op(acc, *i) а результат присваивается *(result + (i - first)).
Использование полностью замкнутых диапазонов является преднамеренным.
template<class InputIterator, class OutputIterator, class T>
OutputIterator exclusive_scan(InputIterator first, InputIterator last,
OutputIterator result,
T init);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class T>
ForwardIterator2 exclusive_scan(ExecutionPolicy&& exec,
ForwardIterator1 first, ForwardIterator1 last,
ForwardIterator2 result,
T init);
Effects: Эквивалентен:
return exclusive_scan(std::forward<ExecutionPolicy>(exec), first, last, result, init, plus<>());
template<class InputIterator, class OutputIterator, class T, class BinaryOperation>
OutputIterator exclusive_scan(InputIterator first, InputIterator last,
OutputIterator result,
T init, BinaryOperation binary_op);
template<class ExecutionPolicy,
class ForwardIterator1, class ForwardIterator2, class T, class BinaryOperation>
ForwardIterator2 exclusive_scan(ExecutionPolicy&& exec,
ForwardIterator1 first, ForwardIterator1 last,
ForwardIterator2 result,
T init, BinaryOperation binary_op);
Requires:
T будет MoveConstructible (таблица 23).
Все binary_op(init, init), binary_op(init, *first)и binary_op(*first, *first) должны быть конвертированы в T.
binary_op не должен ни аннулировать итераторы или поддиапазоны, ни изменять элементы в диапазонах [first, last] или [result, result + (last - first)].
Effects: Каждому целому числу K в [0, last - first) присваивается result + K значение:
GENERALIZED_NONCOMMUTATIVE_SUM(
binary_op, init, *(first + 0), *(first + 1), ..., *(first + K - 1))
template<class InputIterator, class OutputIterator>
OutputIterator inclusive_scan(InputIterator first, InputIterator last,
OutputIterator result);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
ForwardIterator2 inclusive_scan(ExecutionPolicy&& exec,
ForwardIterator1 first, ForwardIterator1 last,
ForwardIterator2 result);
Effects: Эквивалентен:
return inclusive_scan(std::forward<ExecutionPolicy>(exec), first, last, result, plus<>());
template<class InputIterator, class OutputIterator, class BinaryOperation>
OutputIterator inclusive_scan(InputIterator first, InputIterator last,
OutputIterator result,
BinaryOperation binary_op);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
class BinaryOperation>
ForwardIterator2 inclusive_scan(ExecutionPolicy&& exec,
ForwardIterator1 first, ForwardIterator1 last,
ForwardIterator2 result,
BinaryOperation binary_op);
template<class InputIterator, class OutputIterator, class BinaryOperation, class T>
OutputIterator inclusive_scan(InputIterator first, InputIterator last,
OutputIterator result,
BinaryOperation binary_op, T init);
template<class ExecutionPolicy,
class ForwardIterator1, class ForwardIterator2, class BinaryOperation, class T>
ForwardIterator2 inclusive_scan(ExecutionPolicy&& exec,
ForwardIterator1 first, ForwardIterator1 last,
ForwardIterator2 result,
BinaryOperation binary_op, T init);
Requires:
Если init предусмотрено, T должно быть MoveConstructible (Таблица 23); в противном случае ForwardIterator1тип значения должен быть MoveConstructible.
Если init предусмотрено, все binary_op(init, init), binary_op(init, *first)и binary_op(*first, *first) должны быть конвертированы в T; в противном случае binary_op(*first, *first) должен быть преобразован в ForwardIterator1тип значения.
binary_op не должен ни аннулировать итераторы или поддиапазоны, ни изменять элементы в диапазонах [first, last] или [result, result + (last - first)].
Effects: Каждому целому числу K в [0, last - first) присваивается result + K значение
GENERALIZED_NONCOMMUTATIVE_SUM(
binary_op,
init, *(first + 0), *(first + 1), ..., *(first + K))
если init предоставляется, или
GENERALIZED_NONCOMMUTATIVE_SUM(
binary_op,
*(first + 0), *(first + 1), ..., *(first + K))
иначе.
template<class InputIterator, class OutputIterator, class T,
class BinaryOperation, class UnaryOperation>
OutputIterator transform_exclusive_scan(InputIterator first, InputIterator last,
OutputIterator result,
T init,
BinaryOperation binary_op,
UnaryOperation unary_op);
template<class ExecutionPolicy,
class ForwardIterator1, class ForwardIterator2, class T,
class BinaryOperation, class UnaryOperation>
ForwardIterator2 transform_exclusive_scan(ExecutionPolicy&& exec,
ForwardIterator1 first, ForwardIterator1 last,
ForwardIterator2 result,
T init,
BinaryOperation binary_op,
UnaryOperation unary_op);
Requires:
T будет MoveConstructible (таблица 23).
Все
binary_op(init, init),
binary_op(init, unary_op(*first)), а также
binary_op(unary_op(*first), unary_op(*first))
конвертируется в T.
Ни и unary_op не binary_op должны аннулировать итераторы или поддиапазоны, или изменять элементы в диапазонах [first, last] или [result, result + (last - first)].
Effects: Каждому целому числу K в [0, last - first) присваивается result + K значение:
GENERALIZED_NONCOMMUTATIVE_SUM(
binary_op, init,
unary_op(*(first + 0)), unary_op(*(first + 1)), ..., unary_op(*(first + K - 1)))
[ Note: Разница между transform_exclusive_scan и transform_inclusive_scan заключается в том, transform_exclusive_scan что ith элемент ввода исключается из ith суммы. Если binary_op не является математически ассоциативным, поведение transform_exclusive_scan может быть недетерминированным. transform_exclusive_scan не относится unary_op к init. ] — end note
template<class InputIterator, class OutputIterator,
class BinaryOperation, class UnaryOperation>
OutputIterator transform_inclusive_scan(InputIterator first, InputIterator last,
OutputIterator result,
BinaryOperation binary_op,
UnaryOperation unary_op);
template<class ExecutionPolicy,
class ForwardIterator1, class ForwardIterator2,
class BinaryOperation, class UnaryOperation>
ForwardIterator2 transform_inclusive_scan(ExecutionPolicy&& exec,
ForwardIterator1 first, ForwardIterator1 last,
ForwardIterator2 result,
BinaryOperation binary_op,
UnaryOperation unary_op);
template<class InputIterator, class OutputIterator,
class BinaryOperation, class UnaryOperation, class T>
OutputIterator transform_inclusive_scan(InputIterator first, InputIterator last,
OutputIterator result,
BinaryOperation binary_op,
UnaryOperation unary_op,
T init);
template<class ExecutionPolicy,
class ForwardIterator1, class ForwardIterator2,
class BinaryOperation, class UnaryOperation, class T>
ForwardIterator2 transform_inclusive_scan(ExecutionPolicy&& exec,
ForwardIterator1 first, ForwardIterator1 last,
ForwardIterator2 result,
BinaryOperation binary_op,
UnaryOperation unary_op,
T init);
Requires:
Если init предусмотрено, T должно быть MoveConstructible (Таблица 23); в противном случае ForwardIterator1тип значения должен быть MoveConstructible.
Если init предоставляется, все
binary_op(init, init),
binary_op(init, unary_op(*first)), а также
binary_op(unary_op(*first), unary_op(*first))
может быть конвертирован в T; в противном случае binary_op(unary_op(*first), unary_op(*first)) должен быть преобразован в ForwardIterator1тип значения.
Ни и unary_op не binary_op должны аннулировать итераторы или поддиапазоны, а также изменять элементы в диапазонах [first, last] или [result, result + (last - first)].
Effects: Каждому целому числу K в [0, last - first) присваивается result + K значение
GENERALIZED_NONCOMMUTATIVE_SUM(
binary_op, init,
unary_op(*(first + 0)), unary_op(*(first + 1)), ..., unary_op(*(first + K)))
если init предоставляется, или
GENERALIZED_NONCOMMUTATIVE_SUM(
binary_op,
unary_op(*(first + 0)), unary_op(*(first + 1)), ..., unary_op(*(first + K)))
иначе.
[ Note: Разница между transform_exclusive_scan и transform_inclusive_scan заключается в том, transform_inclusive_scan что ith в ith сумму входит входной элемент . Если binary_op не является математически ассоциативным, поведение transform_inclusive_scan может быть недетерминированным. transform_inclusive_scan не относится unary_op к init. ] — end note
template <class InputIterator, class OutputIterator>
OutputIterator
adjacent_difference(InputIterator first, InputIterator last,
OutputIterator result);
template <class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
ForwardIterator2
adjacent_difference(ExecutionPolicy&& exec,
ForwardIterator1 first, ForwardIterator1 last,
ForwardIterator2 result);
template <class InputIterator, class OutputIterator, class BinaryOperation>
OutputIterator
adjacent_difference(InputIterator first, InputIterator last,
OutputIterator result,
BinaryOperation binary_op);
template <class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
class BinaryOperation>
ForwardIterator2
adjacent_difference(ExecutionPolicy&& exec,
ForwardIterator1 first, ForwardIterator1 last,
ForwardIterator2 result,
BinaryOperation binary_op);
Requires:
Для перегрузки без каких - либо ExecutionPolicy, InputIterator«с типом значение должно быть MoveAssignable (таблица 25) и должны быть конструктивны от типа *first. acc (определенный ниже) должен быть доступен для записи ( [iterator.requirements.general]) result итератору вывода. Результат выражения val - acc или binary_op(val, acc) должен быть доступен для записи в result итератор вывода.
Для перегрузок с a ExecutionPolicyтип значения ForwardIterator1 должен быть CopyConstructible (Таблица 24), конструируемым из выражения *first - *first или binary_op(*first, *first)и присваиваемым типу значения ForwardIterator2.
Для всех перегрузок, в диапазонах [first, last] и [result, result + (last - first)], binary_op не должен ни изменять элементы , ни к аннулированию итератора или поддиапазонов.285
Effects: Для перегрузок без ExecutionPolicy и с непустым диапазоном функция создает аккумулятор acc , тип которого является InputIteratorтипом значения, инициализирует его *firstи присваивает результат *result. Для каждого итератора i по [first + 1, last) порядку создает объект val , тип которого является типом InputIteratorзначения, инициализирует его *i, вычисляет val - acc или binary_op(val, acc), присваивает результат *(result + (i - first))и перемещает присваивает из val в acc.
Для перегрузок с ExecutionPolicy диапазоном и непустым диапазоном сначала функция создает объект, тип которого является ForwardIterator1типом значения, инициализирует его *firstи присваивает результат *result. Затем для каждого d in [1, last - first - 1]создает объект val , тип которого является типом ForwardIterator1значения, инициализирует его с помощью *(first + d) - *(first + d - 1) или binary_op(*(first + d), *(first + d - 1))и присваивает результат *(result + d).
Remarks: Для перегрузок без ExecutionPolicy, result может быть равно first. Для перегрузок с ExecutionPolicyдиапазоны [first, last) и [result, result + (last - first)) не должны перекрываться.
Использование полностью замкнутых диапазонов является преднамеренным.
template <class ForwardIterator, class T>
void iota(ForwardIterator first, ForwardIterator last, T value);
Requires: T должен быть преобразован в ForwardIteratorтип значения. Выражение ++val, где val имеет тип T, должно быть правильно сформировано.
Effects: Для каждого элемента, на который ссылается итератор i в диапазоне [first, last), присваивает *i = value и увеличивает, value как если бы ++value.
template <class M, class N>
constexpr common_type_t<M,N> gcd(M m, N n);
Requires: |m| и |n| должен быть представлен как значение common_type_t<M, N>. [ Note: Эти требования гарантируют, например, что gcd(m, m) = |m| это может быть представлено как значение типа M. ] — end note
Remarks: Если один из типов M или N не является целочисленным типом, либо один из них cv bool, программа имеет неправильный формат .
Returns: Ноль, когда m и n оба равны нулю. В противном случае возвращает наибольший общий делитель |m| и |n|.
template <class M, class N>
constexpr common_type_t<M,N> lcm(M m, N n);
Requires: |m| и |n| должен быть представлен как значение common_type_t<M, N>. Наименьшее общее кратное для |m| и |n| должно быть представлено как значение типа common_type_t<M,N>.
Remarks: Если один из типов M или N не является целочисленным, или если один cv bool из них, программа имеет неверный формат .
Returns: Ноль, когда либо m либо n равно нулю. В противном случае возвращает наименьшее общее кратное для |m| и |n|.
namespace std { using float_t = see below; using double_t = see below; } #define HUGE_VAL see below #define HUGE_VALF see below #define HUGE_VALL see below #define INFINITY see below #define NAN see below #define FP_INFINITE see below #define FP_NAN see below #define FP_NORMAL see below #define FP_SUBNORMAL see below #define FP_ZERO see below #define FP_FAST_FMA see below #define FP_FAST_FMAF see below #define FP_FAST_FMAL see below #define FP_ILOGB0 see below #define FP_ILOGBNAN see below #define MATH_ERRNO see below #define MATH_ERREXCEPT see below #define math_errhandling see below namespace std { float acos(float x); // see [library.c] double acos(double x); long double acos(long double x); // see [library.c] float acosf(float x); long double acosl(long double x); float asin(float x); // see [library.c] double asin(double x); long double asin(long double x); // see [library.c] float asinf(float x); long double asinl(long double x); float atan(float x); // see [library.c] double atan(double x); long double atan(long double x); // see [library.c] float atanf(float x); long double atanl(long double x); float atan2(float y, float x); // see [library.c] double atan2(double y, double x); long double atan2(long double y, long double x); // see [library.c] float atan2f(float y, float x); long double atan2l(long double y, long double x); float cos(float x); // see [library.c] double cos(double x); long double cos(long double x); // see [library.c] float cosf(float x); long double cosl(long double x); float sin(float x); // see [library.c] double sin(double x); long double sin(long double x); // see [library.c] float sinf(float x); long double sinl(long double x); float tan(float x); // see [library.c] double tan(double x); long double tan(long double x); // see [library.c] float tanf(float x); long double tanl(long double x); float acosh(float x); // see [library.c] double acosh(double x); long double acosh(long double x); // see [library.c] float acoshf(float x); long double acoshl(long double x); float asinh(float x); // see [library.c] double asinh(double x); long double asinh(long double x); // see [library.c] float asinhf(float x); long double asinhl(long double x); float atanh(float x); // see [library.c] double atanh(double x); long double atanh(long double x); // see [library.c] float atanhf(float x); long double atanhl(long double x); float cosh(float x); // see [library.c] double cosh(double x); long double cosh(long double x); // see [library.c] float coshf(float x); long double coshl(long double x); float sinh(float x); // see [library.c] double sinh(double x); long double sinh(long double x); // see [library.c] float sinhf(float x); long double sinhl(long double x); float tanh(float x); // see [library.c] double tanh(double x); long double tanh(long double x); // see [library.c] float tanhf(float x); long double tanhl(long double x); float exp(float x); // see [library.c] double exp(double x); long double exp(long double x); // see [library.c] float expf(float x); long double expl(long double x); float exp2(float x); // see [library.c] double exp2(double x); long double exp2(long double x); // see [library.c] float exp2f(float x); long double exp2l(long double x); float expm1(float x); // see [library.c] double expm1(double x); long double expm1(long double x); // see [library.c] float expm1f(float x); long double expm1l(long double x); float frexp(float value, int* exp); // see [library.c] double frexp(double value, int* exp); long double frexp(long double value, int* exp); // see [library.c] float frexpf(float value, int* exp); long double frexpl(long double value, int* exp); int ilogb(float x); // see [library.c] int ilogb(double x); int ilogb(long double x); // see [library.c] int ilogbf(float x); int ilogbl(long double x); float ldexp(float x, int exp); // see [library.c] double ldexp(double x, int exp); long double ldexp(long double x, int exp); // see [library.c] float ldexpf(float x, int exp); long double ldexpl(long double x, int exp); float log(float x); // see [library.c] double log(double x); long double log(long double x); // see [library.c] float logf(float x); long double logl(long double x); float log10(float x); // see [library.c] double log10(double x); long double log10(long double x); // see [library.c] float log10f(float x); long double log10l(long double x); float log1p(float x); // see [library.c] double log1p(double x); long double log1p(long double x); // see [library.c] float log1pf(float x); long double log1pl(long double x); float log2(float x); // see [library.c] double log2(double x); long double log2(long double x); // see [library.c] float log2f(float x); long double log2l(long double x); float logb(float x); // see [library.c] double logb(double x); long double logb(long double x); // see [library.c] float logbf(float x); long double logbl(long double x); float modf(float value, float* iptr); // see [library.c] double modf(double value, double* iptr); long double modf(long double value, long double* iptr); // see [library.c] float modff(float value, float* iptr); long double modfl(long double value, long double* iptr); float scalbn(float x, int n); // see [library.c] double scalbn(double x, int n); long double scalbn(long double x, int n); // see [library.c] float scalbnf(float x, int n); long double scalbnl(long double x, int n); float scalbln(float x, long int n); // see [library.c] double scalbln(double x, long int n); long double scalbln(long double x, long int n); // see [library.c] float scalblnf(float x, long int n); long double scalblnl(long double x, long int n); float cbrt(float x); // see [library.c] double cbrt(double x); long double cbrt(long double x); // see [library.c] float cbrtf(float x); long double cbrtl(long double x); // [c.math.abs], absolute values int abs(int j); long int abs(long int j); long long int abs(long long int j); float abs(float j); double abs(double j); long double abs(long double j); float fabs(float x); // see [library.c] double fabs(double x); long double fabs(long double x); // see [library.c] float fabsf(float x); long double fabsl(long double x); float hypot(float x, float y); // see [library.c] double hypot(double x, double y); long double hypot(double x, double y); // see [library.c] float hypotf(float x, float y); long double hypotl(long double x, long double y); // [c.math.hypot3], three-dimensional hypotenuse float hypot(float x, float y, float z); double hypot(double x, double y, double z); long double hypot(long double x, long double y, long double z); float pow(float x, float y); // see [library.c] double pow(double x, double y); long double pow(long double x, long double y); // see [library.c] float powf(float x, float y); long double powl(long double x, long double y); float sqrt(float x); // see [library.c] double sqrt(double x); long double sqrt(long double x); // see [library.c] float sqrtf(float x); long double sqrtl(long double x); float erf(float x); // see [library.c] double erf(double x); long double erf(long double x); // see [library.c] float erff(float x); long double erfl(long double x); float erfc(float x); // see [library.c] double erfc(double x); long double erfc(long double x); // see [library.c] float erfcf(float x); long double erfcl(long double x); float lgamma(float x); // see [library.c] double lgamma(double x); long double lgamma(long double x); // see [library.c] float lgammaf(float x); long double lgammal(long double x); float tgamma(float x); // see [library.c] double tgamma(double x); long double tgamma(long double x); // see [library.c] float tgammaf(float x); long double tgammal(long double x); float ceil(float x); // see [library.c] double ceil(double x); long double ceil(long double x); // see [library.c] float ceilf(float x); long double ceill(long double x); float floor(float x); // see [library.c] double floor(double x); long double floor(long double x); // see [library.c] float floorf(float x); long double floorl(long double x); float nearbyint(float x); // see [library.c] double nearbyint(double x); long double nearbyint(long double x); // see [library.c] float nearbyintf(float x); long double nearbyintl(long double x); float rint(float x); // see [library.c] double rint(double x); long double rint(long double x); // see [library.c] float rintf(float x); long double rintl(long double x); long int lrint(float x); // see [library.c] long int lrint(double x); long int lrint(long double x); // see [library.c] long int lrintf(float x); long int lrintl(long double x); long long int llrint(float x); // see [library.c] long long int llrint(double x); long long int llrint(long double x); // see [library.c] long long int llrintf(float x); long long int llrintl(long double x); float round(float x); // see [library.c] double round(double x); long double round(long double x); // see [library.c] float roundf(float x); long double roundl(long double x); long int lround(float x); // see [library.c] long int lround(double x); long int lround(long double x); // see [library.c] long int lroundf(float x); long int lroundl(long double x); long long int llround(float x); // see [library.c] long long int llround(double x); long long int llround(long double x); // see [library.c] long long int llroundf(float x); long long int llroundl(long double x); float trunc(float x); // see [library.c] double trunc(double x); long double trunc(long double x); // see [library.c] float truncf(float x); long double truncl(long double x); float fmod(float x, float y); // see [library.c] double fmod(double x, double y); long double fmod(long double x, long double y); // see [library.c] float fmodf(float x, float y); long double fmodl(long double x, long double y); float remainder(float x, float y); // see [library.c] double remainder(double x, double y); long double remainder(long double x, long double y); // see [library.c] float remainderf(float x, float y); long double remainderl(long double x, long double y); float remquo(float x, float y, int* quo); // see [library.c] double remquo(double x, double y, int* quo); long double remquo(long double x, long double y, int* quo); // see [library.c] float remquof(float x, float y, int* quo); long double remquol(long double x, long double y, int* quo); float copysign(float x, float y); // see [library.c] double copysign(double x, double y); long double copysign(long double x, long double y); // see [library.c] float copysignf(float x, float y); long double copysignl(long double x, long double y); double nan(const char* tagp); float nanf(const char* tagp); long double nanl(const char* tagp); float nextafter(float x, float y); // see [library.c] double nextafter(double x, double y); long double nextafter(long double x, long double y); // see [library.c] float nextafterf(float x, float y); long double nextafterl(long double x, long double y); float nexttoward(float x, long double y); // see [library.c] double nexttoward(double x, long double y); long double nexttoward(long double x, long double y); // see [library.c] float nexttowardf(float x, long double y); long double nexttowardl(long double x, long double y); float fdim(float x, float y); // see [library.c] double fdim(double x, double y); long double fdim(long double x, long double y); // see [library.c] float fdimf(float x, float y); long double fdiml(long double x, long double y); float fmax(float x, float y); // see [library.c] double fmax(double x, double y); long double fmax(long double x, long double y); // see [library.c] float fmaxf(float x, float y); long double fmaxl(long double x, long double y); float fmin(float x, float y); // see [library.c] double fmin(double x, double y); long double fmin(long double x, long double y); // see [library.c] float fminf(float x, float y); long double fminl(long double x, long double y); float fma(float x, float y, float z); // see [library.c] double fma(double x, double y, double z); long double fma(long double x, long double y, long double z); // see [library.c] float fmaf(float x, float y, float z); long double fmal(long double x, long double y, long double z); // [c.math.fpclass], classification / comparison functions int fpclassify(float x); int fpclassify(double x); int fpclassify(long double x); int isfinite(float x); int isfinite(double x); int isfinite(long double x); int isinf(float x); int isinf(double x); int isinf(long double x); int isnan(float x); int isnan(double x); int isnan(long double x); int isnormal(float x); int isnormal(double x); int isnormal(long double x); int signbit(float x); int signbit(double x); int signbit(long double x); int isgreater(float x, float y); int isgreater(double x, double y); int isgreater(long double x, long double y); int isgreaterequal(float x, float y); int isgreaterequal(double x, double y); int isgreaterequal(long double x, long double y); int isless(float x, float y); int isless(double x, double y); int isless(long double x, long double y); int islessequal(float x, float y); int islessequal(double x, double y); int islessequal(long double x, long double y); int islessgreater(float x, float y); int islessgreater(double x, double y); int islessgreater(long double x, long double y); int isunordered(float x, float y); int isunordered(double x, double y); int isunordered(long double x, long double y); // [sf.cmath], mathematical special functions // [sf.cmath.assoc_laguerre], associated Laguerre polynomials double assoc_laguerre(unsigned n, unsigned m, double x); float assoc_laguerref(unsigned n, unsigned m, float x); long double assoc_laguerrel(unsigned n, unsigned m, long double x); // [sf.cmath.assoc_legendre], associated Legendre functions double assoc_legendre(unsigned l, unsigned m, double x); float assoc_legendref(unsigned l, unsigned m, float x); long double assoc_legendrel(unsigned l, unsigned m, long double x); // [sf.cmath.beta], beta function double beta(double x, double y); float betaf(float x, float y); long double betal(long double x, long double y); // [sf.cmath.comp_ellint_1], complete elliptic integral of the first kind double comp_ellint_1(double k); float comp_ellint_1f(float k); long double comp_ellint_1l(long double k); // [sf.cmath.comp_ellint_2], complete elliptic integral of the second kind double comp_ellint_2(double k); float comp_ellint_2f(float k); long double comp_ellint_2l(long double k); // [sf.cmath.comp_ellint_3], complete elliptic integral of the third kind double comp_ellint_3(double k, double nu); float comp_ellint_3f(float k, float nu); long double comp_ellint_3l(long double k, long double nu); // [sf.cmath.cyl_bessel_i], regular modified cylindrical Bessel functions double cyl_bessel_i(double nu, double x); float cyl_bessel_if(float nu, float x); long double cyl_bessel_il(long double nu, long double x); // [sf.cmath.cyl_bessel_j], cylindrical Bessel functions of the first kind double cyl_bessel_j(double nu, double x); float cyl_bessel_jf(float nu, float x); long double cyl_bessel_jl(long double nu, long double x); // [sf.cmath.cyl_bessel_k], irregular modified cylindrical Bessel functions double cyl_bessel_k(double nu, double x); float cyl_bessel_kf(float nu, float x); long double cyl_bessel_kl(long double nu, long double x); // [sf.cmath.cyl_neumann], cylindrical Neumann functions; // cylindrical Bessel functions of the second kind double cyl_neumann(double nu, double x); float cyl_neumannf(float nu, float x); long double cyl_neumannl(long double nu, long double x); // [sf.cmath.ellint_1], incomplete elliptic integral of the first kind double ellint_1(double k, double phi); float ellint_1f(float k, float phi); long double ellint_1l(long double k, long double phi); // [sf.cmath.ellint_2], incomplete elliptic integral of the second kind double ellint_2(double k, double phi); float ellint_2f(float k, float phi); long double ellint_2l(long double k, long double phi); // [sf.cmath.ellint_3], incomplete elliptic integral of the third kind double ellint_3(double k, double nu, double phi); float ellint_3f(float k, float nu, float phi); long double ellint_3l(long double k, long double nu, long double phi); // [sf.cmath.expint], exponential integral double expint(double x); float expintf(float x); long double expintl(long double x); // [sf.cmath.hermite], Hermite polynomials double hermite(unsigned n, double x); float hermitef(unsigned n, float x); long double hermitel(unsigned n, long double x); // [sf.cmath.laguerre], Laguerre polynomials double laguerre(unsigned n, double x); float laguerref(unsigned n, float x); long double laguerrel(unsigned n, long double x); // [sf.cmath.legendre], Legendre polynomials double legendre(unsigned l, double x); float legendref(unsigned l, float x); long double legendrel(unsigned l, long double x); // [sf.cmath.riemann_zeta], Riemann zeta function double riemann_zeta(double x); float riemann_zetaf(float x); long double riemann_zetal(long double x); // [sf.cmath.sph_bessel], spherical Bessel functions of the first kind double sph_bessel(unsigned n, double x); float sph_besself(unsigned n, float x); long double sph_bessell(unsigned n, long double x); // [sf.cmath.sph_legendre], spherical associated Legendre functions double sph_legendre(unsigned l, unsigned m, double theta); float sph_legendref(unsigned l, unsigned m, float theta); long double sph_legendrel(unsigned l, unsigned m, long double theta); // [sf.cmath.sph_neumann], spherical Neumann functions; // spherical Bessel functions of the second kind: double sph_neumann(unsigned n, double x); float sph_neumannf(unsigned n, float x); long double sph_neumannl(unsigned n, long double x); }
Содержание и значение заголовка <cmath> такие же, как и у заголовка стандартной библиотеки C <math.h>, с добавлением three-dimensional hypotenuse функции и математических специальных функций, описанных в [sf.cmath]. [ Note: Некоторые функции имеют дополнительные перегрузки в этом международном стандарте, но их поведение такое же, как и в C standard library. ] — end note
Для каждого набора перегруженных функций внутри <cmath>, за исключением abs, должны быть дополнительные перегрузки, достаточные для обеспечения:
1.Если какой-либо аргумент арифметического типа, соответствующий double параметру, имеет тип long double, то все аргументы, arithmetic type соответствующие double параметрам, эффективно приводятся к long double.
2.В противном случае, если какой-либо аргумент арифметического типа, соответствующий double параметру, имеет тип double или целочисленный тип, то все аргументы арифметического типа, соответствующие double параметрам, эффективно приводятся к double.
3.В противном случае все аргументы арифметического типа, соответствующие double параметрам, имеют тип float.
[ Note: abs исключен из этих правил, чтобы оставаться совместимым с C. ] — end note
См. Также: ISO C 7.12.
int abs(int j);
long int abs(long int j);
long long int abs(long long int j);
float abs(float j);
double abs(double j);
long double abs(long double j);
Effects: Эти abs функции имеют семантику , указанную в стандартной библиотеке C для функций abs, labs, llabs, fabsf, fabs, и fabsl.
Remarks: Если abs() вызывается с аргументом типа, X для которого is_unsigned_v<X> is true и if X не может быть преобразован в int by integral promotion, программа имеет неправильный формат. [ Note: Аргументы, которые могут быть повышены int , разрешены для совместимости с C. ] — end note
См. Также: ISO C 7.12.7.2, 7.22.6.1.
float hypot(float x, float y, float z);
double hypot(double x, double y, double z);
long double hypot(long double x, long double y, long double z);
Если какое-либо значение аргумента для любой из функций, указанных в этом подпункте, является NaN (не числом), функция должна возвращать NaN, но не должна сообщать об ошибке домена. В противном случае функция должна сообщать об ошибке домена только для тех значений аргументов, для которых:
предложение описания функции Returns: явно указывает домен, и значения этих аргументов выходят за пределы указанного домена, или
соответствующее значение математической функции имеет ненулевую мнимую составляющую, или
соответствующая математическая функция математически не определена.286
Если не указано иное, каждая функция определена для всех конечных значений, для отрицательной бесконечности и для положительной бесконечности.
Математическая функция определяется математически для данного набора значений аргумента (a), если она явно определена для этого набора значений аргумента, или (b), если ее предельное значение существует и не зависит от направления подхода.
double assoc_laguerre(unsigned n, unsigned m, double x);
float assoc_laguerref(unsigned n, unsigned m, float x);
long double assoc_laguerrel(unsigned n, unsigned m, long double x);
double assoc_legendre(unsigned l, unsigned m, double x);
float assoc_legendref(unsigned l, unsigned m, float x);
long double assoc_legendrel(unsigned l, unsigned m, long double x);
double beta(double x, double y);
float betaf(float x, float y);
long double betal(long double x, long double y);
double comp_ellint_1(double k);
float comp_ellint_1f(float k);
long double comp_ellint_1l(long double k);
Effects: Эти функции вычисляют полный эллиптический интеграл первого рода своих соответствующих аргументов k.
См. Также [sf.cmath.ellint_1].
double comp_ellint_2(double k);
float comp_ellint_2f(float k);
long double comp_ellint_2l(long double k);
Effects: Эти функции вычисляют полный эллиптический интеграл второго рода своих соответствующих аргументов k.
См. Также [sf.cmath.ellint_2].
double comp_ellint_3(double k, double nu);
float comp_ellint_3f(float k, float nu);
long double comp_ellint_3l(long double k, long double nu);
Effects: Эти функции вычисляют полный эллиптический интеграл третьего рода от своих соответствующих аргументов k и nu.
См. Также [sf.cmath.ellint_3].
double cyl_bessel_i(double nu, double x);
float cyl_bessel_if(float nu, float x);
long double cyl_bessel_il(long double nu, long double x);
Effects: Эти функции вычисляют обычные модифицированные цилиндрические функции Бесселя своих соответствующих аргументов nu и x.
См. Также [sf.cmath.cyl_bessel_j].
double cyl_bessel_j(double nu, double x);
float cyl_bessel_jf(float nu, float x);
long double cyl_bessel_jl(long double nu, long double x);
Effects: Эти функции вычисляют цилиндрические функции Бесселя первого рода с соответствующими аргументами nu и x.
double cyl_bessel_k(double nu, double x);
float cyl_bessel_kf(float nu, float x);
long double cyl_bessel_kl(long double nu, long double x);
Effects: Эти функции вычисляют нерегулярные модифицированные цилиндрические функции Бесселя своих соответствующих аргументов nu и x.
Returns:
Kν(x)=(π/2)iν+1(Jν(ix)+iNν(ix))=⎧⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎨⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎩π2I−ν(x)−Iν(x)sinνπ,for x≥0 and non-integral νπ2limμ→νI−μ(x)−Iμ(x)sinμπ,for x≥0 and integral ν
где ν есть nu и x есть x.
Смотрите также [sf.cmath.cyl_bessel_i], [sf.cmath.cyl_bessel_j], [sf.cmath.cyl_neumann].
double cyl_neumann(double nu, double x);
float cyl_neumannf(float nu, float x);
long double cyl_neumannl(long double nu, long double x);
Effects: Эти функции вычисляют цилиндрические функции Неймана, также известные как цилиндрические функции Бесселя второго рода, их соответствующих аргументов nu и x.
Returns:
Nν(x)=⎧⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎨⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎩Jν(x)cosνπ−J−ν(x)sinνπ,for x≥0 and non-integral νlimμ→νJμ(x)cosμπ−J−μ(x)sinμπ,for x≥0 and integral ν
где ν есть nu и x есть x.
См. Также [sf.cmath.cyl_bessel_j].
double ellint_1(double k, double phi);
float ellint_1f(float k, float phi);
long double ellint_1l(long double k, long double phi);
Effects: Эти функции вычисляют неполный эллиптический интеграл первого типа своих соответствующих аргументов k и phi ( phi измеряется в радианах).
double ellint_2(double k, double phi);
float ellint_2f(float k, float phi);
long double ellint_2l(long double k, long double phi);
Effects: Эти функции вычисляют неполный эллиптический интеграл второго рода своих соответствующих аргументов k и phi ( phi измеряется в радианах).
double ellint_3(double k, double nu, double phi);
float ellint_3f(float k, float nu, float phi);
long double ellint_3l(long double k, long double nu, long double phi);
Effects: Эти функции вычислить неполный эллиптический интеграл третьего рода их соответствующих аргументов k, nuи phi ( phi измеренный в радианах).
double expint(double x);
float expintf(float x);
long double expintl(long double x);
double hermite(unsigned n, double x);
float hermitef(unsigned n, float x);
long double hermitel(unsigned n, long double x);
double laguerre(unsigned n, double x);
float laguerref(unsigned n, float x);
long double laguerrel(unsigned n, long double x);
double legendre(unsigned l, double x);
float legendref(unsigned l, float x);
long double legendrel(unsigned l, long double x);
double riemann_zeta(double x);
float riemann_zetaf(float x);
long double riemann_zetal(long double x);
double sph_bessel(unsigned n, double x);
float sph_besself(unsigned n, float x);
long double sph_bessell(unsigned n, long double x);
Effects: Эти функции вычисляют сферические функции Бесселя первого рода их соответствующих аргументов n и x.
См. Также [sf.cmath.cyl_bessel_j].
double sph_legendre(unsigned l, unsigned m, double theta);
float sph_legendref(unsigned l, unsigned m, float theta);
long double sph_legendrel(unsigned l, unsigned m, long double theta);
Effects: Эти функции вычислить сферические функции Лежандра связанные с их соответствующих аргументов l, mи theta ( theta в радианах).
Returns:
Ymℓ(θ,0)
куда
Ymℓ(θ,ϕ)=(−1)m[(2ℓ+1)4π(ℓ−m)!(ℓ+m)!]1/2Pmℓ(cosθ)eimϕ,for |m|≤ℓ
и l есть l, m есть mи θ есть theta.
См. Также [sf.cmath.assoc_legendre].
double sph_neumann(unsigned n, double x);
float sph_neumannf(unsigned n, float x);
long double sph_neumannl(unsigned n, long double x);
Effects: Эти функции вычисляют сферические функции Неймана, также известные как сферические функции Бесселя второго рода, их соответствующих аргументов n и x.
См. Также [sf.cmath.cyl_neumann].