В чем разница между "STL" и "стандартной библиотекой C++"?

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

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

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

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

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

5 ответов


"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++, известную как "шаблоны".

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

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

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

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

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

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

вывод

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

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

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


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

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

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

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

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

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


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

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

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

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

...

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

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


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


С GNU Standard C++ Library (libstdc++) FAQ:


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

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

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

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

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


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