C++ Technical Report 1
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.
В следующей таблице приведены все 23 специальных функций, описанные в TR1.
Имя функции | Прототип функции | Математическое выражение |
---|---|---|
Обобщённые полиномы Лягерра | double assoc_laguerre(unsigned n, unsigned m, double x) ; | [math]\displaystyle{ {L_n}^m(x) = (-1)^m \frac{d^m}{dx^m} L_{n+m}(x), \text{ for } x \ge 0 }[/math] |
Присоединённые многочлены Лежандра | double assoc_legendre(unsigned l, unsigned m, double x) ; | [math]\displaystyle{ {P_l}^m(x) = (1-x^2)^{m/2} \frac{d^m}{dx^m} P_l(x), \text{ for } x \ge 0 }[/math] |
Бета-функция | double beta(double x, double y) ; | [math]\displaystyle{ \Beta(x,y)=\frac{\Gamma(x) \Gamma(y)}{\Gamma(x+y)} }[/math] |
Полный нормальный эллиптический интеграл Лежандра 1-го рода | double comp_ellint_1(double k) ; | [math]\displaystyle{ K(k) = F\left(k, \textstyle \frac{\pi}{2}\right) = \int_0^{\frac{\pi}{2}} \frac{d\theta}{\sqrt{1 - k^2 \sin^2 \theta}} }[/math] |
Полный нормальный эллиптический интеграл Лежандра 2-го рода | double comp_ellint_2(double k) ; | [math]\displaystyle{ E\left(k, \textstyle \frac{\pi}{2}\right) = \int_0^{\frac{\pi}{2}} \sqrt{1 - k^2 \sin^2 \theta}\; d\theta }[/math] |
Полный нормальный эллиптический интеграл Лежандра 3-го рода | double comp_ellint_3(double k, double nu) ; | [math]\displaystyle{ \Pi\left(\nu, k, \textstyle \frac{\pi}{2}\right) = \int_0^{\frac{\pi}{2}} \frac{d\theta}{(1 - \nu \sin^2 \theta)\sqrt{1 - k^2 \sin^2 \theta}} }[/math] |
Вырожденные гипергеометрические функции | double conf_hyperg(double a, double c, double x) ; | [math]\displaystyle{ F(a, c, x) = \frac{\Gamma(c)}{\Gamma(a)} \sum_{n = 0}^\infty \frac{\Gamma(a + n) x^n}{\Gamma(c + n) n!} }[/math] |
Регулярные цилиндрические функции Бесселя | double cyl_bessel_i(double nu, double x) ; | [math]\displaystyle{ I_\nu(x) = i^{-\nu} J_\nu(ix) = \sum_{k = 0}^\infty \frac{(x/2)^{\nu + 2k}}{k! \; \Gamma(\nu + k + 1)}, \text{ for } x \ge 0 }[/math] |
Цилиндрические функции Бесселя первого рода | double cyl_bessel_j(double nu, double x) ; | [math]\displaystyle{ J_\nu(x) = \sum_{k = 0}^\infty \frac{(-1)^k \; (x/2)^{\nu + 2k}}{k! \; \Gamma(\nu + k + 1)}, \text{ for } x \ge 0 }[/math] |
en:Irregular modified cylindrical Bessel functions | double cyl_bessel_k(double nu, double x) ; | [math]\displaystyle{ \begin{align} K_\nu(x) & = \textstyle\frac{\pi}{2} i^{\nu+1} \big(J_\nu(ix) + i N_\nu(ix)\big) \\ & = \begin{cases} \displaystyle \frac{I_{-\nu}(x) - I_\nu(x)}{\sin \nu\pi}, & \text{for } x \ge 0 \text{ and } \nu \notin \mathbb{Z} \\[10pt] \displaystyle \frac{\pi}{2} \lim_{\mu \to \nu} \frac{I_{-\mu}(x) - I_\mu(x)}{\sin \mu\pi}, & \text{for } x \lt 0 \text{ and } \nu \in \mathbb{Z} \\ \end{cases} \end{align} }[/math] |
en:Cylindrical Neumann functions | double cyl_neumann(double nu, double x) ; | [math]\displaystyle{ N_\nu(x) = \begin{cases} \displaystyle \frac{J_\nu(x)\cos \nu\pi - J_{-\nu}(x)}{\sin \nu\pi}, & \text{for } x \ge 0 \text{ and } \nu \notin \mathbb{Z} \\[10pt] \displaystyle \lim_{\mu \to \nu} \frac{J_\mu(x)\cos \mu\pi - J_{-\mu}(x)}{\sin \mu\pi}, & \text{for } x \lt 0 \text{ and } \nu \in \mathbb{Z} \\ \end{cases} }[/math] |
Неполный нормальный эллиптический интеграл 1-го рода | double ellint_1(double k, double phi) ; | [math]\displaystyle{ F(k,\phi)=\int_0^\phi\frac{d\theta}{\sqrt{1-k^2\sin^2\theta}}, \text{ for } \left|k\right| \le 1 }[/math] |
Неполный нормальный эллиптический интеграл 2-го рода | double ellint_2(double k, double phi) ; | [math]\displaystyle{ \displaystyle E(k,\phi)=\int_0^\phi\sqrt{1-k^2\sin^2\theta}d\theta, \text{ for } \left|k\right| \le 1 }[/math] |
Неполный нормальный эллиптический интеграл 3-го рода | double ellint_3(double k, double nu, double phi) ; | [math]\displaystyle{ \Pi(k,\nu,\phi)=\int_0^\phi\frac{d\theta}{\left(1-\nu\sin^2\theta\right)\sqrt{1-k^2\sin^2\theta}}, \text{ for } \left|k\right| \le 1 }[/math] |
Интегральная показательная функция | double expint(double x) ; | [math]\displaystyle{ \mbox{E}i(x)=-\int_{-x}^{\infty} \frac{e^{-t}}{t}\, dt }[/math] |
Многочлены Эрмита | double hermite(unsigned n, double x) ; | [math]\displaystyle{ H_n(x)=(-1)^n e^{x^2}\frac{d^n}{dx^n}e^{-x^2} }[/math] |
en:Hypergeometric series | double hyperg(double a, double b, double c, double x) ; | [math]\displaystyle{ F(a,b,c,x)=\frac{\Gamma(c)}{\Gamma(a)\Gamma(b)}\sum_{n = 0}^\infty\frac{\Gamma(a+n)\Gamma(b+n)}{\Gamma(c+n)}\frac{x^n}{n!} }[/math] |
en:Laguerre polynomials | double laguerre(unsigned n, double x) ; | [math]\displaystyle{ L_n(x)=\frac{e^x}{n!}\frac{d^n}{dx^n}\left(x^n e^{-x}\right), \text{ for } x \ge 0 }[/math] |
en:Legendre polynomials | double legendre(unsigned l, double x) ; | [math]\displaystyle{ P_l(x) = {1 \over 2^l l!} {d^l \over dx^l } (x^2 -1)^l, \text{ for } \left|x\right| \le 1 }[/math] |
Дзета-функция Римана | double riemann_zeta(double x) ; | [math]\displaystyle{ \Zeta(x) = \begin{cases} \displaystyle \sum_{k = 1}^\infty k^{-x}, & \text{for } x \gt 1 \\[10pt] \displaystyle 2^x\pi^{x-1}\sin\left(\frac{x\pi}{2}\right)\Gamma(1-x)\zeta(1-x), & \text{for } x \lt 1 \\ \end{cases} }[/math] |
en:Spherical Bessel functions of the first kind | double sph_bessel(unsigned n, double x) ; | [math]\displaystyle{ j_n(x) = \sqrt{\frac{\pi}{2x}} J_{n+1/2}(x), \text{ for } x \ge 0 }[/math] |
en:Spherical associated Legendre functions | double sph_legendre(unsigned l, unsigned m, double theta) ; | [math]\displaystyle{ Y_{l}^{m}(\theta, 0) \text{ where } Y_{l}^{m}(\theta, \phi) = (-1)^{m}\left[\frac{(2l+1)}{4\pi}\frac{(l-m)!}{(l+m)!}\right]^{1 \over 2} P_{l}^{m}(cos \theta)e^{im\phi}, \text{ for } |m| \leq l }[/math] |
en:Spherical Neumann functions | double sph_neumann(unsigned n, double x) ; | [math]\displaystyle{ n_n(x) = \left(\frac{\pi}{2x}\right)^{\frac{1}{2}}N_{n+\frac{1}{2}}(x), \text{ for } x \ge 0 }[/math] |
Каждая функция имеет два дополнительных варианта. Добавление 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].
Некоторые из предлагаемых расширений:
- Потоки выполнения [1]
- Работа с сетью (библиотека Asio) [2][3]
- Сигналы и слоты [4][5]
- Работа с файловой системой (Boost Filesystem) [6]
- Типобезопасный контейнер для значений произвольных типов (Boost Any) [7]
- Лексические преобразования (Boost Lexical Cast) [8]
- Новые алгоритмы обработки строк [9]
- Концепты некоторых алгебраических структур [10]
- Поддержка гетерогенных операторов сравнения для поиска в контейнерах [11]
См. также
Примечания
- ↑ TR2 call for proposals . Дата обращения: 17 апреля 2013. Архивировано 18 апреля 2013 года.
- ↑ TR2 is dead; multiple TR's coming instead . (недоступная ссылка)
Литература
- ISO/IEC JTC1/SC22/WG21. Draft Technical Report on C++ Library Extensions (неопр.). — 2005. — 24 июня.
- Becker, Peter. The C++ Standard Library Extensions: A Tutorial and Reference (англ.). — Addison-Wesley Professional, 2006. — ISBN 0-321-41299-0.
Ссылки
- Scott Meyers' Effective C++: TR1 Information — contains links to the TR1 proposal documents which provide background and rationale for the TR1 libraries.