В чем разница между "STL" и "C ++ Standard Library"? - PullRequest
413 голосов
/ 05 марта 2011

Кто-то довел до моего сведения эту статью , который заявляет (я перефразирую) термин STL неправильно используется для ссылки на всю Стандартную библиотеку C ++ вместо взятых частейот SGI STL.

(...) это относится к "STL", несмотря на тот факт, что очень немногие люди все еще используют STL (который был разработан в SGI).

Части Стандартной библиотеки C ++ были основаны на частях STL, и именно эти части многие люди (включая нескольких авторов и пресловутый cplusplus.com с ошибками) все еще называют «STL».Тем не менее, это неточно;действительно, в стандарте C ++ никогда не упоминается «STL», и между ними существуют различия в содержании.

(...) «STL» редко используется для ссылки на биты stdlib, которые оказались основаннымина SGI STL.Люди думают, что это вся стандартная библиотека.Это ставится на резюме.И это вводит в заблуждение.

Я почти ничего не знаю об истории C ++, поэтому не могу судить о правильности статьи.Должен ли я воздерживаться от использования термина STL?Или это изолированное мнение?

Ответы [ 5 ]

536 голосов
/ 05 марта 2011

«STL» был написан Александром Степановым за несколько дней до стандартизации C ++.C ++ существовал в течение 80-х годов, но то, что мы сейчас называем « C ++ », является языком, стандартизованным в ISO / IEC 14882: 2014 (и более ранних версиях, таких как ISO / IEC 14882: 2011).

STL уже широко использовался в качестве библиотеки для C ++, предоставляя программистам доступ к контейнерам, итераторам и алгоритмам.Когда произошла стандартизация, языковой комитет разработал частей Стандартной библиотеки C ++ (которая является частью языкового стандарта), чтобы очень точно соответствовал STL.

БолееВ течение многих лет многие люди, включая выдающихся авторов книг и различные веб-сайты, продолжали называть Стандартную библиотеку C ++ «STL», несмотря на то, что эти две сущности являются отдельными и существуют некоторые различия.Эти различия еще более заметны в грядущем новом стандарте C ++, который включает в себя различные функции и существенно изменяет некоторые классы.

Оригинальный STL теперь часто называют «реализацией стандартной библиотеки шаблонов C ++» (скорее в обратном направлениифактическая история!), так же, как ваша Microsoft Visual Studio или GCC поставляет реализацию стандартной библиотеки C ++.Но «Стандартная библиотека шаблонов» и «Стандартная библиотека» - это не одно и то же.

Битва идет о том, должна ли текущая Стандартная библиотека называться «STL» полностью или частично, и / илиимеет ли значение то, что называется.

Для «STL»

Существует школа мысли, которая говорит, что теперь все знают, что «STL» означает стандартную библиотеку,точно так же, как теперь все знают, что "C ++" является стандартизированным языком ISO.

В него также входят те, кто считает, что это на самом деле не имеет значения , пока все стороны понимают, что происходито котором говорили.

Этот термин стал еще более распространенным по природе зверя, большая часть которого широко использует функцию C ++, известную как "шаблоны".

For "Стандартная библиотека C ++ "(или stdlib)

Однако есть еще одна школа мысли, на которую я подписываюсь, которая говорит, что это сбивает с толку.Люди, изучающие C ++ впервые , не знают этого различия и могут не заметить небольших языковых различий.

Автор этой статьи много раз встречал людей, которые считают, что весь стандарт C ++Библиотека является STL, включая функции, которые никогда не были частью самого STL.Напротив, большинство сторонников "STL" точно знают, что они имеют в виду, и отказываются верить, что не все "понимают" это.Понятно, что использование этого термина неодинаково.

Кроме того, существуют некоторые библиотеки, подобные STL, которые на самом деле являются реализациями исходного STL, а не Стандартной библиотеки C ++.До недавнего времени STLPort был одним из них (и даже там путаница изобилует!).

Кроме того, стандарт C ++ не содержит текст "STL"где-нибудь, и некоторые люди обычно используют такие фразы, как «STL включен в C ++ Standard Library», что совершенно неверно.

Я убежден, что продолжение пропаганды использования этого термина просто приведет к недоразумению, которое будет продолжаться вечно.Увы, попытка изменить ситуацию может быть совершенно непродуктивной, даже если это должно быть к лучшему.Возможно, мы застряли с двойным смыслом навсегда.

Заключение

Я ценю, что этот пост был немного предвзятым: я написал статью, на которую вы ссылались.:) Во всяком случае, я надеюсь, что это поможет объяснить битву немного лучше.

Обновление 13/04/2011

Вот три совершенных примеров того, кто использует «STL» для ссылки на всю стандартную библиотеку C ++.Меня продолжает сбивать с толку то, что так много людей клянутся слепыми, что никто никогда не делает этого, когда это видно почти ежедневно.

81 голосов
/ 05 марта 2011

Нет единственно правильного ответа. Александр Степанов разработал библиотеку, которую он назвал STL (в то время работал на HP). Затем эту библиотеку предложили включить в стандарт C ++.

Это в основном "разветвленная" разработка. Комитет включал некоторые части, полностью отклонил другие и переработал несколько (с участием Александра). Разработка исходной библиотеки была позже перенесена в Silicon Graphics, но продолжена отдельно от стандартной библиотеки C ++.

После того, как эти части были добавлены в стандартную библиотеку, некоторые другие части стандартной библиотеки были изменены, чтобы лучше соответствовать тому, что было добавлено (например, begin, end, rbegin и rend были добавлены в std::string чтобы его можно было использовать как контейнер). Примерно в то же время большинство библиотеки (даже фрагменты, которые были полностью несвязанными) были преобразованы в шаблоны для размещения различных типов (например, стандартных потоков).

Некоторые люди также используют STL в качестве краткой формы «Стандартной библиотеки».

Это означает, что когда кто-то использует термин "STL", он может относиться к любому из примерно полдюжины разных вещей. Что бы там ни было, большинство людей, которые используют его, похоже, игнорируют множество значений и предполагают, что все остальные поймут, что они имеют в виду. Это приводит ко многим недоразумениям и, по крайней мере, к нескольким серьезным огненным войнам, которые заставили большинство участников выглядеть глупо, потому что они просто говорили о совершенно разных вещах.

К сожалению, эта путаница, вероятно, сохранится. Гораздо удобнее ссылаться на «STL», чем на «контейнеры, итераторы и алгоритмы в стандартной библиотеке C ++, но не включая std::string, даже если он может действовать как контейнер». Хотя «стандартная библиотека C ++» не такая длинная и неуклюжая, «STL» все еще намного короче и проще. До тех пор, пока кто-нибудь не изобрел такие термины, которые более точны (когда это необходимо), и так же удобно, «STL» будет продолжать использоваться, и в результате возникнет путаница.

47 голосов
/ 05 марта 2011

Термин «STL» или «Стандартная библиотека шаблонов» не встречается нигде в стандарте ISO 14882 C ++. Поэтому ссылаться на стандартную библиотеку C ++ как на STL неправильно. Термин «Стандартная библиотека C ++» или «стандартная библиотека» - это то, что официально используется ISO 14882:

Стандарт ISO 14882 C ++:

17 - Введение в библиотеку [lib.library]:

  1. В этом разделе описывается содержание Стандартной библиотеки C ++ , как правильно сформированная программа на C ++ использует библиотека, и как соответствует реализация может обеспечить сущности в библиотеке.

...

STL - это библиотека, изначально разработанная Александром Степановым, независимая от стандарта C ++. Однако некоторые компоненты стандартной библиотеки C ++ включают такие компоненты STL, как vector, list и алгоритмы, такие как copy и swap.

.

Но, конечно, стандарт C ++ включает в себя гораздо больше вещей, помимо STL, поэтому термин «стандартная библиотека C ++» является более правильным (и это то, что фактически используется в документах стандартов).

22 голосов
/ 05 марта 2011

Недавно я привел тот же аргумент, но я верю, что допускается немного терпимости. Если Скотт Мейерс совершит ту же ошибку, значит, вы в хорошей компании.

2 голосов
/ 13 апреля 2018

Из часто задаваемых вопросов по Стандартной библиотеке C ++ GNU (libstdc ++) :


STL (Стандартная библиотека шаблонов) послужила источником вдохновения для больших кусков Стандартной библиотеки C ++, ноТермины не являются взаимозаменяемыми и не означают одно и то же.Стандартная библиотека C ++ включает в себя множество вещей, которые не пришли из STL, и некоторые из них даже не являются шаблонами, такими как std::locale и std::thread.

Libstdc ++ - v3 включает в себя многокод из SGI STL (окончательное слияние было из релиз 3.3 ).Код в libstdc ++ содержит множество исправлений и изменений по сравнению с исходным кодом SGI.

В частности, string не от SGI и не использует их класс «веревки» (хотя он включен как дополнительныйрасширение), ни valarray, ни некоторые другие.Классы типа vector<> были от SGI, но были значительно изменены.

Более подробную информацию об эволюции libstdc ++ можно найти в API evolution и обратной совместимости документацию.

FAQ для SGL STL по-прежнему рекомендуется читать.


FYI, по состоянию на март 2018 года даже официальный веб-сайт STL www.sgi.com/tech/stl/ пропал .

...