Яка різниця між "STL" та "Стандартною бібліотекою C ++"?


446

Хтось звернув цю статтю до мене, що стверджує (я перефразую) термін STL зловживається для позначення всієї стандартної бібліотеки C ++ замість частин, взятих із SGI STL.

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

Частини стандартної бібліотеки C ++ були засновані на частинах STL, і саме ці частини багато людей (включаючи декількох авторів та сумно відомі помилки cplusplus.com) досі називають "STL". Однак це неточно; Дійсно, стандарт C ++ ніколи не згадує "STL", і між ними є змістові відмінності.

(...) "STL" рідко використовується для позначення бітів stdlib, які трапляються на основі SGI STL. Люди думають, що це вся стандартна бібліотека. Це ставиться на резюме. І це вводить в оману.

Я майже не знаю нічого про історію C ++, тому не можу судити про правильність статті. Чи варто утримуватися від використання терміна STL? Або це поодинока думка?


62
Людям потрібні хороші імена, щоб описати речі. Геній Степанова змінив спосіб нашого програмування. Таке ім'я, як "стандартне програмування бібліотеки", вкрай марно описувати це. Назвіть це "stl програмування", і всі знають, що ви маєте на увазі. Аргументувати це просто не вистачає суті: нам потрібне хороше ім’я.
Ганс Пасант

34
@Hans: Ні, ти пропускаєш думку: " всі знають, що ти маєш на увазі" - це неправда .
Гонки легкості на Орбіті

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"

Існує школа думки, яка говорить, що всі тепер знають, що "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. Grrr
Гонки легкості по орбіті

40
І МС СТЛ підтримується S tephan T . L avavej, він же STL.
Михайла


26
Bjarne Stroustrup спеціально відрізняє STL від інших частин Стандартної бібліотеки в "каноні", 4-му випуску мови програмування C ++.
codenheim

84

Немає жодної відповіді, яка справді є правильною. Олександр Степанов розробив бібліотеку, яку він назвав STL (тоді працював на HP). Тоді ця бібліотека була запропонована для включення до стандарту C ++.

Це в основному "роздвоєне" розвиток. До складу комітету входили одні частини, інші повністю відхилялися та декілька були перероблені (за участю Олександра). Пізніше розвиток оригінальної бібліотеки було перенесено на Silicon Graphics, але продовжилося окремо від стандартної бібліотеки C ++.

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

Деякі люди також використовують STL як лише коротку форму "Бібліотеки STandard".

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

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


5
@Jerry: Колишній; ось що означає "std". :)
Гонки легкості на Орбіті

6
@Jerry: Не впевнений, куди потрапляють простори імен. Сумісні реалізації нічого не додають до простору імен std. Я говорив про "std" в "stdlib", що означає "стандарт". Я думаю, що цілком зрозуміло, що це означає!
Гонки легкості на Орбіті

3
@ Джеррі: Я дійсно не думаю, що очікувати, що хтось прочитає прикметник "стандарт", як "це в стандарті", не варто. Тим часом, 17.4.3.1/1 цілком зрозуміло, що додавання речей до простору імен stdє UB, за винятком деяких конкретних іменованих випадків: ці випадки додавання названі у стандарті і, таким чином, досі ідеально відповідають; "стандарт" все ще застосовуватиметься.
Гонки легкості на Орбіті

1
Історія SGI та HP тут назад. Степанов був в HP перед тим, як він був в SGI.
Краген Хав'єр Сітакер

2
Я просто перечитав тут коментарі і подумав, що варто додати ще один (правда, другорядний) пункт: Я думаю, що трохи розтягнутись на очікування, що "стандарт" завжди буде означати "це в стандарті". Зокрема, багато програмістів на З ++ використовується фраза «стандартна бібліотека» задовго до того , був стандарт. Щоб я не думав, що вони посилаються на бібліотеку в стандарті С, я зазначу, що те саме було і для програмістів на C задовго до того, як був (навіть проект проекту) стандарту С.
Джеррі Труну

52

Термін "STL" або "Стандартна бібліотека шаблонів" ніде не відображається в стандарті ISO 14882 C ++. Тож посилатися на стандартну бібліотеку C ++ як STL неправильно. Термін "Стандартна бібліотека C ++" або "Стандартна бібліотека" - це те, що офіційно використовується ISO 14882:

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

17 - Вступ до бібліотеки [lib.library]:

  1. Цей пункт описує вміст стандартної бібліотеки C ++ , те, як добре сформована програма C ++ використовує бібліотеку, і як відповідна реалізація може забезпечити сутності в бібліотеці.

...

STL - бібліотека, спочатку створена Олександром Степановим, незалежна від стандарту C ++. Тим НЕ менше, деякі компоненти стандартної бібліотеки С ++ включають в себе компоненти , такі як STL vector, listі алгоритми , як copyі swap.

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


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

1
У той час більшість компіляторів C ++ не реалізовували простори імен. Насправді я не знаю, чи були вони навіть у стандарті.
Краген Хав'єр Сітакер

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

3
Ой. Що ж, були кілька книг Струструпа, але я вважаю, що це не зовсім те саме, чи не так?
Краген Хав'єр Сітакер

23

Я висловлював цей самий аргумент нещодавно, але вважаю, що можна допустити невелику толерантність. Якщо Скотт Майєрс помилився, ви в хорошій компанії.


@Tomalak & @Mark: Насправді Скотт не -1від мене. Книга справді про STL в значенні "частин std lib, що випливають з бібліотеки Степанова". Знайдіть час, щоб переглянути книги TOC. Єдине, що я могла знайти за межами оригінальної STL std::string, і це було обладнано для повноцінного контейнера STL.
sbi

@sbi: Ви, очевидно, неправильно трактували мою позицію. Я б не використовував "STL" таким чином, як це робить Скотт. Прочитайте, будь ласка, мою відповідь.
Гонки легкості на Орбіті

6
@Tomalak, я також не використовував би "STL" таким чином, хоча я, мабуть, був винен у цьому раніше. Я просто не думаю, що варто перебивати людей.
Марк Викуп

1
Що я можу поважати. Мене найбільше турбують люди, які взагалі відмовляються визнати потенційну неоднозначність. :)
Гонки легкості на орбіті

11
Ви також були б у компанії Bjarne Stroustrup - ref. напр. stroustrup.com/DnE2005.pdf : "STL (" Стандартна бібліотека шаблонів "; тобто рамки контейнерів та алгоритмів стандартної бібліотеки ISO C ++)"
Sander De Dycker,

7

Зі стандартної бібліотеки 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 та назад .

FAQ для STL від SGI ще рекомендується читання.


FYI, станом на березень 2018 року навіть офіційного веб-сайту STL www.sgi.com/tech/stl/ вже немає .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.