В чем разница между «STL» и «C ++ Standard Library»?

370

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

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

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

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

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

  • 0
    соответствующее обсуждение
  • 58
    Людям нужны хорошие имена, чтобы описывать вещи. Гений Степанова изменил способ, которым мы программируем. Такое название, как «стандартное программирование библиотеки», совершенно бесполезно для описания этого. Назовите это «программирование STL», и все знают, что вы имеете в виду. Спорить об этом просто не хватает смысла: нам нужно хорошее имя.
Показать ещё 12 комментариев
Теги:
std
stl
c++-standard-library
c++-faq

5 ответов

461
Лучший ответ

"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" для обозначения всей стандартной библиотеки С++. Он продолжает меня озадачивать, что так много людей клянутся слепыми, что никто никогда не делает этого, когда это видно почти ежедневно.

  • 0
    Если есть какие-либо противоположные мнения, которые я не упомянул, пожалуйста, прокомментируйте, и я буду более чем рад добавить их к ответу (хотя я не согласен с ними).
  • 130
    S tandard Т emplate л ibrary был не только создан St epanov и L ЭИ, но они также работают в S oftware Т ехнологии L aboratory в то время.
Показать ещё 29 комментариев
77

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

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

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

Некоторые люди также используют STL как короткую форму "STandard Library".

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

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

  • 24
    +1. Я рекомендую "stdlib".
  • 0
    @Tomalak Geret'kal: Такого рода работает для всей стандартной библиотеки, но даже там вы сталкиваетесь с проблемой: когда я говорю (например): «X в stdlib», я имею в виду то, что стандарт требует, чтобы все соответствовало компиляторы для поставки, или что происходит с конкретным компилятором?
Показать ещё 7 комментариев
43

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

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

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

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

...

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

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

  • 4
    +1. Хотя в STL, не было никакого std пространства имен (IIRC).
  • 1
    В то время большинство компиляторов C ++ не реализовывали пространства имен. На самом деле, я не знаю, были ли они даже в стандарте.
Показать ещё 2 комментария
21

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

  • 0
    @Tomalak & @Mark: На самом деле Скотт нет, -1 от меня. Книга действительно о STL в значении «части стандартной библиотеки, вытекающие из библиотеки Степанова». Потратьте время, чтобы просмотреть книги TOC. Единственное, что я мог найти вне оригинального STL - это std::string , который был оборудован как полноценный контейнер STL.
  • 0
    @Sbi: Вы, очевидно, неправильно истолковали мою позицию. Я бы не использовал «STL» так, как Скотт. Пожалуйста, прочитайте мой ответ.
Показать ещё 3 комментария
0

Из Часто задаваемые вопросы по библиотеке 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/ушел.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню