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


446

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

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

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

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

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


62
Людям нужны хорошие имена, чтобы описывать вещи. Гений Степанова изменил способ, которым мы программируем. Такое имя, как «стандартное программирование библиотеки», совершенно бесполезно для описания этого. Назовите это «программирование STL», и все знают, что вы имеете в виду. Спорить об этом просто не хватает смысла: нам нужно хорошее имя.
Ганс Пассант

34
@ Ханс: Нет, вы упускаете суть: « все знают, что вы имеете в виду», это не правда .
Гонки легкости на орбите

16
Понятия не имею, что вы имеете в виду.
Ганс Пассант

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

Ответы:


571

«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» означает стандартную библиотеку, точно так же, как все теперь знают, что «C ++» является стандартизированным языком ISO.

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

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

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

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

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

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

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

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

Вывод

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

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

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


136
S tandard Т emplate л ibrary был не только создан St epanov и L ЭИ, но они также работают в S oftware T ехнологии L aboratory в то время.
Краген Хавьер Ситакер

21
Кто-то сегодня спрашивал, в чем заголовок std::iota, потому что он не мог заставить его работать. Это нестандартное расширение SGI , которое они называют «стандартным», когда оно подходит им, потому что это «STL», и все знают, что «STL» является частью стандартной библиотеки C ++, верно? И это было введено в C ++ 0x, но не доступно в C ++ 03. Хмм.
Гонки легкости на орбите

40
И МС СТЛ поддерживается S tephan T . L avavej, он же STL.
Михаела


26
Бьярн Страуструп специально отличает STL от других частей стандартной библиотеки в «каноне», языке программирования C ++, 4-е издание.
коденхайм

84

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

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

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

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

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

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


5
@ Джерри: бывший; это то, что означает "стандартный". :)
Лёгкие гонки на орбите

6
@ Джерри: Не уверен, где пространства имен входят в это. Совместимые реализации ничего не добавляют в пространство имен std. Я говорил о «std» в «stdlib», что означает «стандартный». Я думаю, это довольно ясно, что это значит!
Гонки легкости на орбите

3
@ Джерри: Я действительно не думаю, что можно ожидать, что кто-то прочитает прилагательное «стандарт» как «это в стандарте». Между тем, 17.4.3.1/1 совершенно ясно, что добавление вещей в пространство имен stdявляется UB, за исключением некоторых конкретных именованных случаев: эти случаи добавления названы в стандарте и, таким образом, все еще полностью совместимы; «стандарт» все равно будет применяться.
Гонки легкости на орбите

1
История SGI и HP здесь назад. Степанов был в HP, прежде чем он был в SGI.
Краген Хавьер Ситакер

2
Я просто перечитал комментарии здесь и подумал, что стоит добавить еще один (по общему признанию, незначительный) пункт: я думаю, что немного сложно ожидать, что «стандарт» всегда будет означать «это в стандарте». В частности, многие программисты на С ++ используется фраза «стандартная библиотека» задолго до того , был стандарт. Чтобы не думать, что они ссылаются на библиотеку в стандарте C, я укажу, что то же самое было верно для программистов на C задолго до того, как появился (даже черновой вариант) стандарт на C.
Джерри Коффин

52

Термин «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 ++» является более правильным (и это то, что фактически используется в документах стандартов).


5
+1. Хотя в STL не было stdпространства имен (IIRC).
Гонки легкости на орбите

1
В то время большинство компиляторов C ++ не реализовывали пространства имен. На самом деле, я не знаю, были ли они даже в стандарте.
Краген Хавьер Ситакер

3
@ Краген: Ну, не было никакого стандарта.
Гонки легкости на орбите

3
Ой. Ну, было несколько книг Страуструпа, но я полагаю, это не совсем то же самое, не так ли?
Краген Хавьер Ситакер

23

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


@ Томалак и @ Марк: На самом деле Скотт не -1от меня. Книга действительно о STL в значении «частей стандартной библиотеки, происходящих из библиотеки Степанова». Потратьте время, чтобы просмотреть книги TOC. Единственное, что я мог найти за пределами оригинального STL, это то std::string, что он был оборудован как полноценный контейнер STL.
ВОО

@Sbi: Вы, очевидно, неправильно истолковали мою позицию. Я бы не использовал «STL» так, как Скотт. Пожалуйста, прочитайте мой ответ.
Гонки легкости на орбите

6
@ Томалак, я бы тоже не стал использовать «STL», хотя в прошлом я, вероятно, был виновен в этом. Я просто не думаю, что стоит избивать людей.
Марк Рэнсом

1
Это я могу уважать. Меня больше всего беспокоит тот, кто вообще отказывается признать потенциальную двусмысленность. :)
Лёгкие гонки на орбите

11
Вы также были бы в компании Bjarne Stroustrup - ref. например. stroustrup.com/DnE2005.pdf : «STL (« Стандартная библиотека шаблонов », то есть контейнеры и структура алгоритмов стандартной библиотеки ISO C ++)»
Сандер Де Дайкер,

7

Из FAQ библиотеки GNU Standard C ++ (libstdc ++) :


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

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

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

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

FAQ для STL от SGI еще рекомендуется чтение.


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.