Какая разница между "STL" и "С++ Standard Library"?

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

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

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

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

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

Ответ 1

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

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

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

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

Битва идет о том, должна ли текущая стандартная библиотека быть названа "STL" целиком или частично и/или имеет ли это значение то, что она называла.

Для "STL"

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

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

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

Для "стандартной библиотеки С++" (или stdlib)

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

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

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

Кроме того, стандарт С++ не содержит текст "STL" в любом месте, и некоторые люди обычно используют такие фразы, как "STL включен в стандартную библиотеку С++", что является неправильным.

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

Заключение

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

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

Вот три perfect примеры того, кто использует "STL" для обозначения всей стандартной библиотеки С++. Он продолжает меня озадачивать, что так много людей клянутся слепыми, что никто никогда не делает этого, когда это видно почти ежедневно.

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

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

...

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

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

Ответ 4

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

Ответ 5

Из Часто задаваемые вопросы по библиотеке GNU Standard С++ (libstdС++):


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

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

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

Более подробную информацию об эволюции libstdС++ можно найти в эволюции API и обратная совместимость.

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


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