C++ Technical Report 1

Поделись знанием:
Перейти к: навигация, поиск

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

Документ впервые был распространён в виде черновика [www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf Draft Technical Report on C++ Library Extensions], затем в 2007 году опубликован, как ISO/IEC стандарт, под названием [www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?ics1=35&ics2=60&ics3=&csnumber=43289 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) ; <math>{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>{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>\Beta(x,y)=\frac{\Gamma(x) \Gamma(y)}{\Gamma(x+y)}</math>
Полный нормальный эллиптический интеграл Лежандра 1-го рода double comp_ellint_1(double k) ; <math>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>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>\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>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>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>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>\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 < 0 \text{ and } \nu \in \mathbb{Z} \\
            \end{cases}

\end{align}</math>

en:Cylindrical Neumann functions

en:Cylindrical Bessel functions of the second kind

double cyl_neumann(double nu, double x) ; <math>

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 < 0 \text{ and } \nu \in \mathbb{Z} \\
            \end{cases}

</math>

Неполный нормальный эллиптический интеграл 1-го рода double ellint_1(double k, double phi) ; k\right| \le 1</math>
Неполный нормальный эллиптический интеграл 2-го рода double ellint_2(double k, double phi) ; k\right| \le 1</math>
Неполный нормальный эллиптический интеграл 3-го рода double ellint_3(double k, double nu, double phi) ; k\right| \le 1</math>
Интегральная показательная функция double expint(double x) ; <math> \mbox{E}i(x)=-\int_{-x}^{\infty} \frac{e^{-t}}{t}\, dt</math>
Многочлены Эрмита double hermite(unsigned n, double x) ; <math>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>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>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) ; x\right| \le 1 </math>
Дзета-функция Римана double riemann_zeta(double x) ; <math>

\Zeta(x) =

         \begin{cases}
                \displaystyle \sum_{k = 1}^\infty k^{-x}, & \text{for } x > 1 \\[10pt]
                \displaystyle 2^x\pi^{x-1}\sin\left(\frac{x\pi}{2}\right)\Gamma(1-x)\zeta(1-x), & \text{for } x < 1 \\
            \end{cases}

</math>

en:Spherical Bessel functions of the first kind double sph_bessel(unsigned n, double x) ; <math>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) ; m| \leq l</math>
en:Spherical Neumann functions

en:Spherical Bessel functions of the second kind

double sph_neumann(unsigned n, double x) ; <math>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 — это попытка примирить некоторые из различий данных языков путём добавления различных заголовков в следующие библиотеки С++: <complex>, <locale>, <cmath> и т. д. Данные изменения способствуют приведению C++ в соответствие с C99 (не все части C99 включены в TR1).

Techical Report 2

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

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

  • Потоки выполнения [www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1883.pdf]
  • Работа с сетью (библиотека Asio) [www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1925.pdf][www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2175.pdf]
  • Сигналы и слоты [www.mail-archive.com/libsigc-list@gnome.org/msg00115.html][www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2086.pdf]
  • Работа с файловой системой (Boost Filesystem) [www.open-std.org/JTC1/sc22/WG21/docs/papers/2011/n3239.html]
  • Типобезопасный контейнер для значений произвольных типов (Boost Any) [www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1939.html]
  • Лексические преобразования (Boost Lexical Cast) [www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1973.html]
  • Новые алгоритмы обработки строк [www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2059.html#abstract]
  • Концепты некоторых алгебраических структур [www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/]
  • Поддержка гетерогенных операторов сравнения для поиска в контейнерах [www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2882.pdf]

См. также

Напишите отзыв о статье "C++ Technical Report 1"

Примечания

  1. [www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1810.html TR2 call for proposals]. Проверено 17 апреля 2013. [www.webcitation.org/6FyTChajE Архивировано из первоисточника 18 апреля 2013].
  2. [thread.gmane.org/gmane.comp.lib.boost.devel/228312 TR2 is dead; multiple TR's coming instead].

Литература

  • ISO/IEC JTC1/SC22/WG21 (2005-06-24). «[www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf Draft Technical Report on C++ Library Extensions]» (PDF).
  • Becker Peter. The C++ Standard Library Extensions: A Tutorial and Reference. — Addison-Wesley Professional, 2006. — ISBN 0-321-41299-0.

Ссылки

  • [aristeia.com/EC3E/TR1_info_frames.html Scott Meyers' Effective C++: TR1 Information] — contains links to the TR1 proposal documents which provide background and rationale for the TR1 libraries.

Отрывок, характеризующий C++ Technical Report 1

– Вы, батюшка, что тут делаете во фраке? – спросил его басистый голос.
Это был кавалерийский генерал, в эту кампанию заслуживший особенную милость государя, бывший начальник дивизии, в которой служил Ростов.
Ростов испуганно начал оправдываться, но увидав добродушно шутливое лицо генерала, отойдя к стороне, взволнованным голосом передал ему всё дело, прося заступиться за известного генералу Денисова. Генерал выслушав Ростова серьезно покачал головой.
– Жалко, жалко молодца; давай письмо.
Едва Ростов успел передать письмо и рассказать всё дело Денисова, как с лестницы застучали быстрые шаги со шпорами и генерал, отойдя от него, подвинулся к крыльцу. Господа свиты государя сбежали с лестницы и пошли к лошадям. Берейтор Эне, тот самый, который был в Аустерлице, подвел лошадь государя, и на лестнице послышался легкий скрип шагов, которые сейчас узнал Ростов. Забыв опасность быть узнанным, Ростов подвинулся с несколькими любопытными из жителей к самому крыльцу и опять, после двух лет, он увидал те же обожаемые им черты, то же лицо, тот же взгляд, ту же походку, то же соединение величия и кротости… И чувство восторга и любви к государю с прежнею силою воскресло в душе Ростова. Государь в Преображенском мундире, в белых лосинах и высоких ботфортах, с звездой, которую не знал Ростов (это была legion d'honneur) [звезда почетного легиона] вышел на крыльцо, держа шляпу под рукой и надевая перчатку. Он остановился, оглядываясь и всё освещая вокруг себя своим взглядом. Кое кому из генералов он сказал несколько слов. Он узнал тоже бывшего начальника дивизии Ростова, улыбнулся ему и подозвал его к себе.
Вся свита отступила, и Ростов видел, как генерал этот что то довольно долго говорил государю.
Государь сказал ему несколько слов и сделал шаг, чтобы подойти к лошади. Опять толпа свиты и толпа улицы, в которой был Ростов, придвинулись к государю. Остановившись у лошади и взявшись рукою за седло, государь обратился к кавалерийскому генералу и сказал громко, очевидно с желанием, чтобы все слышали его.
– Не могу, генерал, и потому не могу, что закон сильнее меня, – сказал государь и занес ногу в стремя. Генерал почтительно наклонил голову, государь сел и поехал галопом по улице. Ростов, не помня себя от восторга, с толпою побежал за ним.


На площади куда поехал государь, стояли лицом к лицу справа батальон преображенцев, слева батальон французской гвардии в медвежьих шапках.
В то время как государь подъезжал к одному флангу баталионов, сделавших на караул, к противоположному флангу подскакивала другая толпа всадников и впереди их Ростов узнал Наполеона. Это не мог быть никто другой. Он ехал галопом в маленькой шляпе, с Андреевской лентой через плечо, в раскрытом над белым камзолом синем мундире, на необыкновенно породистой арабской серой лошади, на малиновом, золотом шитом, чепраке. Подъехав к Александру, он приподнял шляпу и при этом движении кавалерийский глаз Ростова не мог не заметить, что Наполеон дурно и не твердо сидел на лошади. Батальоны закричали: Ура и Vive l'Empereur! [Да здравствует Император!] Наполеон что то сказал Александру. Оба императора слезли с лошадей и взяли друг друга за руки. На лице Наполеона была неприятно притворная улыбка. Александр с ласковым выражением что то говорил ему.
Ростов не спуская глаз, несмотря на топтание лошадьми французских жандармов, осаживавших толпу, следил за каждым движением императора Александра и Бонапарте. Его, как неожиданность, поразило то, что Александр держал себя как равный с Бонапарте, и что Бонапарте совершенно свободно, как будто эта близость с государем естественна и привычна ему, как равный, обращался с русским царем.
Александр и Наполеон с длинным хвостом свиты подошли к правому флангу Преображенского батальона, прямо на толпу, которая стояла тут. Толпа очутилась неожиданно так близко к императорам, что Ростову, стоявшему в передних рядах ее, стало страшно, как бы его не узнали.
– Sire, je vous demande la permission de donner la legion d'honneur au plus brave de vos soldats, [Государь, я прошу у вас позволенья дать орден Почетного легиона храбрейшему из ваших солдат,] – сказал резкий, точный голос, договаривающий каждую букву. Это говорил малый ростом Бонапарте, снизу прямо глядя в глаза Александру. Александр внимательно слушал то, что ему говорили, и наклонив голову, приятно улыбнулся.
– A celui qui s'est le plus vaillament conduit dans cette derieniere guerre, [Тому, кто храбрее всех показал себя во время войны,] – прибавил Наполеон, отчеканивая каждый слог, с возмутительным для Ростова спокойствием и уверенностью оглядывая ряды русских, вытянувшихся перед ним солдат, всё держащих на караул и неподвижно глядящих в лицо своего императора.
– Votre majeste me permettra t elle de demander l'avis du colonel? [Ваше Величество позволит ли мне спросить мнение полковника?] – сказал Александр и сделал несколько поспешных шагов к князю Козловскому, командиру батальона. Бонапарте стал между тем снимать перчатку с белой, маленькой руки и разорвав ее, бросил. Адъютант, сзади торопливо бросившись вперед, поднял ее.
– Кому дать? – не громко, по русски спросил император Александр у Козловского.
– Кому прикажете, ваше величество? – Государь недовольно поморщился и, оглянувшись, сказал:
– Да ведь надобно же отвечать ему.
Козловский с решительным видом оглянулся на ряды и в этом взгляде захватил и Ростова.
«Уж не меня ли?» подумал Ростов.
– Лазарев! – нахмурившись прокомандовал полковник; и первый по ранжиру солдат, Лазарев, бойко вышел вперед.
– Куда же ты? Тут стой! – зашептали голоса на Лазарева, не знавшего куда ему итти. Лазарев остановился, испуганно покосившись на полковника, и лицо его дрогнуло, как это бывает с солдатами, вызываемыми перед фронт.
Наполеон чуть поворотил голову назад и отвел назад свою маленькую пухлую ручку, как будто желая взять что то. Лица его свиты, догадавшись в ту же секунду в чем дело, засуетились, зашептались, передавая что то один другому, и паж, тот самый, которого вчера видел Ростов у Бориса, выбежал вперед и почтительно наклонившись над протянутой рукой и не заставив ее дожидаться ни одной секунды, вложил в нее орден на красной ленте. Наполеон, не глядя, сжал два пальца. Орден очутился между ними. Наполеон подошел к Лазареву, который, выкатывая глаза, упорно продолжал смотреть только на своего государя, и оглянулся на императора Александра, показывая этим, что то, что он делал теперь, он делал для своего союзника. Маленькая белая рука с орденом дотронулась до пуговицы солдата Лазарева. Как будто Наполеон знал, что для того, чтобы навсегда этот солдат был счастлив, награжден и отличен от всех в мире, нужно было только, чтобы его, Наполеонова рука, удостоила дотронуться до груди солдата. Наполеон только прило жил крест к груди Лазарева и, пустив руку, обратился к Александру, как будто он знал, что крест должен прилипнуть к груди Лазарева. Крест действительно прилип.
Русские и французские услужливые руки, мгновенно подхватив крест, прицепили его к мундиру. Лазарев мрачно взглянул на маленького человечка, с белыми руками, который что то сделал над ним, и продолжая неподвижно держать на караул, опять прямо стал глядеть в глаза Александру, как будто он спрашивал Александра: всё ли еще ему стоять, или не прикажут ли ему пройтись теперь, или может быть еще что нибудь сделать? Но ему ничего не приказывали, и он довольно долго оставался в этом неподвижном состоянии.
Государи сели верхами и уехали. Преображенцы, расстроивая ряды, перемешались с французскими гвардейцами и сели за столы, приготовленные для них.
Лазарев сидел на почетном месте; его обнимали, поздравляли и жали ему руки русские и французские офицеры. Толпы офицеров и народа подходили, чтобы только посмотреть на Лазарева. Гул говора русского французского и хохота стоял на площади вокруг столов. Два офицера с раскрасневшимися лицами, веселые и счастливые прошли мимо Ростова.
– Каково, брат, угощенье? Всё на серебре, – сказал один. – Лазарева видел?
– Видел.
– Завтра, говорят, преображенцы их угащивать будут.
– Нет, Лазареву то какое счастье! 10 франков пожизненного пенсиона.
– Вот так шапка, ребята! – кричал преображенец, надевая мохнатую шапку француза.