C++ Technical Report 1

Материал из testwiki
Перейти к навигации Перейти к поиску

C++ Technical Report 1 (TR1) является общим названием для стандарта ISO/IEC TR 19768, библиотеки расширений C++ — это документ с предложением дополнений в стандарт библиотеки C++. Дополнения включают регулярные выражения, умные указатели, хеш-таблицы, и генераторы случайных чисел. TR1 не стандарт, а скорее проект документа. Однако, большинство его предложений стало частью следующего официального стандарта, C++11.

Документ впервые был распространён в виде черновика Draft Technical Report on C++ Library Extensions, затем в 2007 году опубликован как ISO/IEC стандарт под названием ISO/IEC TR 19768:2007.

Дополнения, описанные в TR1

Все дополнения, которые описывает TR1, находятся в namespace std::tr1

Общие утилиты

  • reference_wrapper
  • Умные указатели:
    • shared_ptr
    • weak_ptr

Функциональные объекты

Определены в заголовочном файле tr1/functional

  • function
  • bind
  • result_of
  • mem_fn

Метапрограммирование и type_traits

Несколько меташаблонов определено в tr1/functional: is_pod, has_virtual_destructor, remove_extent, и другие. Основано на Boost Type Traits.

Генерация случайных чисел

Заголовочный файл tr1/random определяет:

  • variate_generator
  • mersenne_twister
  • poisson_distribution, etc.

Специальные математические функции

Некоторые особенности TR1, такие, как специальные математические функции и некоторые дополнения C99, которые не включены в Visual C++ реализацию TR1.

Данные дополнения не попали в C++11.

  • дополнения к <cmath>/<math.h> файлы заголовков — beta, legendre и т. д.

В следующей таблице приведены все 23 специальные функции, описанные в TR1.

Имя функции Прототип функции Математическое выражение
Обобщённые полиномы Лягерра double assoc_laguerre(unsigned n, unsigned m, double x) ; Lnm(x)=(1)mdmdxmLn+m(x), for x0
Присоединённые многочлены Лежандра double assoc_legendre(unsigned l, unsigned m, double x) ; Plm(x)=(1x2)m/2dmdxmPl(x), for x0
Бета-функция double beta(double x, double y) ; B(x,y)=Γ(x)Γ(y)Γ(x+y)
Полный нормальный эллиптический интеграл Лежандра 1-го рода double comp_ellint_1(double k) ; K(k)=F(k,π2)=0π2dθ1k2sin2θ
Полный нормальный эллиптический интеграл Лежандра 2-го рода double comp_ellint_2(double k) ; E(k,π2)=0π21k2sin2θdθ
Полный нормальный эллиптический интеграл Лежандра 3-го рода double comp_ellint_3(double k, double nu) ; Π(ν,k,π2)=0π2dθ(1νsin2θ)1k2sin2θ
Вырожденные гипергеометрические функции double conf_hyperg(double a, double c, double x) ; F(a,c,x)=Γ(c)Γ(a)n=0Γ(a+n)xnΓ(c+n)n!
Регулярные цилиндрические функции Бесселя double cyl_bessel_i(double nu, double x) ; Iν(x)=iνJν(ix)=k=0(x/2)ν+2kk!Γ(ν+k+1), for x0
Цилиндрические функции Бесселя первого рода double cyl_bessel_j(double nu, double x) ; Jν(x)=k=0(1)k(x/2)ν+2kk!Γ(ν+k+1), for x0
en:Irregular modified cylindrical Bessel functions double cyl_bessel_k(double nu, double x) ; Kν(x)=π2iν+1(Jν(ix)+iNν(ix))={Iν(x)Iν(x)sinνπ,for x0 and νπ2limμνIμ(x)Iμ(x)sinμπ,for x<0 and ν
en:Cylindrical Neumann functions

en:Cylindrical Bessel functions of the second kind

double cyl_neumann(double nu, double x) ; Nν(x)={Jν(x)cosνπJν(x)sinνπ,for x0 and νlimμνJμ(x)cosμπJμ(x)sinμπ,for x<0 and ν
Неполный нормальный эллиптический интеграл 1-го рода double ellint_1(double k, double phi) ; F(k,ϕ)=0ϕdθ1k2sin2θ, for |k|1
Неполный нормальный эллиптический интеграл 2-го рода double ellint_2(double k, double phi) ; E(k,ϕ)=0ϕ1k2sin2θdθ, for |k|1
Неполный нормальный эллиптический интеграл 3-го рода double ellint_3(double k, double nu, double phi) ; Π(k,ν,ϕ)=0ϕdθ(1νsin2θ)1k2sin2θ, for |k|1
Интегральная показательная функция double expint(double x) ; Ei(x)=xettdt
Многочлены Эрмита double hermite(unsigned n, double x) ; Hn(x)=(1)nex2dndxnex2
en:Hypergeometric series double hyperg(double a, double b, double c, double x) ; F(a,b,c,x)=Γ(c)Γ(a)Γ(b)n=0Γ(a+n)Γ(b+n)Γ(c+n)xnn!
en:Laguerre polynomials double laguerre(unsigned n, double x) ; Ln(x)=exn!dndxn(xnex), for x0
en:Legendre polynomials double legendre(unsigned l, double x) ; Pl(x)=12ll!dldxl(x21)l, for |x|1
Дзета-функция Римана double riemann_zeta(double x) ; Z(x)={k=1kx,for x>12xπx1sin(xπ2)Γ(1x)ζ(1x),for x<1
en:Spherical Bessel functions of the first kind double sph_bessel(unsigned n, double x) ; jn(x)=π2xJn+1/2(x), for x0
en:Spherical associated Legendre functions double sph_legendre(unsigned l, unsigned m, double theta) ; Ylm(θ,0) where Ylm(θ,ϕ)=(1)m[(2l+1)4π(lm)!(l+m)!]12Plm(cosθ)eimϕ, for |m|l
en:Spherical Neumann functions

en:Spherical Bessel functions of the second kind

double sph_neumann(unsigned n, double x) ; nn(x)=(π2x)12Nn+12(x), for x0

Каждая функция имеет два дополнительных варианта. Добавление F 'или' L 'суффикс к имени функции дает функцию, которая действует на float или long double значения соответственно. Например:

float sph_neumannf( unsigned n, float x ) ;
long double sph_neumannl( unsigned n, long double x ) ;

Контейнеры

Тип для кортежей — tuple, основан на Boost Tuple, похож на расширение std: pair для большего числа объектов.

Тип для массивов фиксированной длины — array, основан на Boost Array.

Хеш-контейнеры

Заголовочные файлы unordered_set, unordered_map. Типы unordered_set, unordered_multiset, unordered_map, unordered_multimap (аналоги set, multiset, map, multimap). Обеспечивают в среднем константное время доступа, но в худшем случае длительность операции будет иметь линейную сложность в зависимости от количества элементов в контейнере.

Регулярные выражения

Заголовочный файл regex, предоставляет regex, regex_match, regex_search, regex_replace и т. п. Основан на Boost RegEx.

Совместимость с Си

Одной из концепций при разработке C++ было обеспечение как можно большей совместимости с языком программирования Си. Однако данная концепция не являлась и не является приоритетной, а лишь настоятельно рекомендованной, а потому C++ нельзя в строгом смысле считать надмножеством Си (стандарты этих языков расходятся). TR1 — это попытка примирить некоторые из различий данных языков путём добавления различных заголовков в следующие библиотеки C++: <complex>, <locale>, <cmath> и т. д. Данные изменения способствуют приведению C++ в соответствие с C99 (не все части C99 включены в TR1).

Techical Report 2

Существовали планы по публикации следующего набора дополнений, C++ Technical Report 2, после стандартизации C++11[1]. Однако впоследствии комитет по стандартизации отказался от TR2 в пользу компактных проблемно-ориентированных спецификаций[2].

Некоторые из предлагаемых расширений:

См. также

Примечания

Шаблон:Примечания

Литература

Ссылки