Jaka jest różnica między „STL” a „Standardową biblioteką C ++”?


446

Ktoś zwrócił moją uwagę na ten artykuł, który twierdzi (parafrazuję), że termin STL jest niewłaściwie używany w odniesieniu do całej Standardowej Biblioteki C ++ zamiast części, które zostały zaczerpnięte z SGI STL.

(...) odnosi się do „STL”, mimo że bardzo niewiele osób nadal korzysta z STL (który został zaprojektowany w SGI).

Części Standardowej Biblioteki C ++ były oparte na częściach STL, i to właśnie te części wielu osób (w tym kilku autorów i notorycznie obarczony błędami cplusplus.com) nadal nazywa się „STL”. Jest to jednak niedokładne; w rzeczywistości standard C ++ nigdy nie wspomina o „STL” i między nimi występują różnice w treści.

(...) „STL” jest rzadko używane w odniesieniu do bitów stdlib opartych na SGI STL. Ludzie myślą, że to cała standardowa biblioteka. Zostaje umieszczony na CV. I to jest mylące.

Prawie nic nie wiem o historii C ++, więc nie mogę ocenić poprawności artykułu. Czy powinienem powstrzymać się od używania terminu STL? Czy jest to izolowana opinia?


62
Ludzie potrzebują dobrych nazwisk, aby opisać różne rzeczy. Geniusz Stepanowa zmienił sposób, w jaki programujemy. Nazwa taka jak „standardowe programowanie biblioteki” jest całkowicie bezużyteczna do opisania tego. Nazwij to „programowaniem STL” i wszyscy wiedzą, co masz na myśli. Kłócenie się o to po prostu nie ma sensu: potrzebujemy dobrego imienia.
Hans Passant

34
@Hans: Nie, nie rozumiesz sedna sprawy: „ wszyscy wiedzą, co masz na myśli”, nie jest prawdą .
Wyścigi lekkości na orbicie

16
Nie mam pojęcia, co masz na myśli.
Hans Passant,

21
Oto doskonały przykład osoby, która używa „STL” w odniesieniu do całej biblioteki standardowej C ++. Wciąż mnie zaskakuje, że tak wielu ludzi przysięga na ślepo, że nikt tego nigdy nie robi, kiedy widać to prawie codziennie.
Wyścigi lekkości na orbicie

Odpowiedzi:


571

„STL” został napisany przez Aleksandra Stepanowa na wiele dni przed standaryzacją C ++. C ++ istniał w latach 80., ale to, co teraz nazywamy „ C ++ ”, jest językiem znormalizowanym w ISO / IEC 14882: 2014 (i wcześniejszych wersjach, takich jak ISO / IEC 14882: 2011).

STL był już szeroko stosowany jako biblioteka dla C ++, dając programistom dostęp do kontenerów, iteratorów i algorytmów. Kiedy nastąpiła standaryzacja, komitet językowy zaprojektował części Standardowej Biblioteki C ++ (która jest częścią standardu językowego), aby bardzo ściśle pasowały do ​​STL.

Przez lata wiele osób - w tym wybitni autorzy książek i różne strony internetowe - nadal używało Standardowej Biblioteki C ++ jako „STL”, pomimo faktu, że te dwa podmioty są oddzielne i istnieją pewne różnice. Różnice te są jeszcze bardziej wyraźne w nadchodzącym nowym standardzie C ++, który zawiera różne funkcje i znacząco zmienia niektóre klasy.

Oryginalny STL jest obecnie często nazywany „implementacją Standardowej Biblioteki Szablonów C ++” (raczej wstecz do faktycznej historii!), W taki sam sposób, w jaki Microsoft Visual Studio lub GCC dostarcza implementację Standardowej Biblioteki C ++. Ale „Standardowa biblioteka szablonów” i „Standardowa biblioteka” to nie to samo.

Bitwa dotyczy tego, czy obecna Biblioteka Standardowa powinna być nazywana „STL” w całości czy w części i / lub czy ma znaczenie, jak się nazywa.

Dla „STL”

Istnieje szkoła myślenia, która mówi, że wszyscy wiedzą, że „STL” oznacza bibliotekę standardową, podobnie jak wszyscy wiedzą, że „C ++” jest językiem znormalizowanym ISO.

Dotyczy to również tych, którzy uważają, że to nie ma znaczenia, o ile wszystkie strony rozumieją, o czym mówi się.

Jest to termin jeszcze bardziej rozpowszechniony ze względu na naturę bestii, z których wiele w dużym stopniu wykorzystuje funkcję C ++ znaną jako „szablony”.

Dla „C ++ Standard Library” (lub stdlib)

Istnieje jednak inna szkoła myślenia - do której się zgadzam - która mówi, że jest to mylące. Ludzie uczący się C ++ po raz pierwszy nie znają tego rozróżnienia i mogą nie zauważyć niewielkich różnic językowych.

Autor tego artykułu wiele razy spotykał się z ludźmi, którzy wierzą, że cała biblioteka standardowa C ++ to STL, w tym funkcje, które nigdy nie były częścią samej STL. Z drugiej strony większość głosicieli „STL” dokładnie wie, co przez to rozumieją i nie wierzy, że nie wszyscy to rozumieją. Oczywiście użycie tego terminu nie jest jednolite.

Ponadto istnieją biblioteki podobne do STL, które w rzeczywistości są implementacjami oryginalnej biblioteki STL, a nie biblioteki standardowej C ++. Do niedawna STLPort był jednym z nich (i nawet tam zamieszanie jest ogromne!).

Ponadto standard C ++ nie zawiera nigdzie tekstu „STL”, a niektóre osoby zwykle używają zwrotów takich jak „STL znajduje się w standardowej bibliotece C ++”, co jest po prostu niepoprawne.

Wierzę, że dalsze rozpowszechnianie użycia tego terminu w ten sposób doprowadzi do nieporozumień, które będą trwały wiecznie. Niestety próba zmiany rzeczy może być całkowicie bezproduktywna, nawet jeśli ma to być lepsze. Możemy po prostu utknąć na zawsze w podwójnym znaczeniu.

Wniosek

Doceniam to, że ten post był nieco stronniczy: napisałem artykuł, do którego linkujesz. :) W każdym razie mam nadzieję, że to pomoże trochę lepiej wyjaśnić bitwę.

Aktualizacja 13/04/2011

Oto trzy doskonałe przykłady kogoś, kto używa „STL” w odniesieniu do całej biblioteki standardowej C ++. Wciąż mnie zaskakuje, że tak wielu ludzi przysięga na ślepo, że nikt tego nigdy nie robi, kiedy widać to prawie codziennie.


136
S tandard T emplate L ibrary nie został stworzony tylko przez św epanov i L ee, ale były również pracuje w S oftware T echnology L aboratory w tym czasie.
Kragen Javier Sitaker

21
Czy ktoś dzisiaj pyta, w co std::iotajest nagłówek , ponieważ nie mógł go uruchomić. Jest to niestandardowe rozszerzenie SGI , które nazywają „standardowym”, kiedy im odpowiada, ponieważ jest to „STL” i wszyscy wiedzą, że „STL” jest częścią Standardowej Biblioteki C ++, prawda? I został wprowadzony w C ++ 0x, ale nie jest dostępny w C ++ 03. Grrr.
Lekkość ściga się na orbicie

40
I MS STL prowadzi S tephan T . L avavej, vel STL.
Mihaela,


26
Bjarne Stroustrup wyraźnie odróżnia STL od innych części biblioteki standardowej w „kanonie”, The C ++ Programming Language 4th Edition.
codenheim,

84

Nie ma jednej poprawnej odpowiedzi. Alexander Stepanov opracował bibliotekę, którą nazwał STL (wówczas pracował dla HP). Tę bibliotekę zaproponowano następnie do włączenia do standardu C ++.

To w zasadzie „rozwidlony” rozwój. Komitet obejmował niektóre części, całkowicie odrzucał inne i przeprojektował kilka (z udziałem Aleksandra). Opracowanie oryginalnej biblioteki zostało później przeniesione do Silicon Graphics, ale kontynuowane oddzielnie od standardowej biblioteki C ++.

Po te kawałki zostały dodane do standardowej biblioteki inne części biblioteki standardowej zostały zmodyfikowane, aby lepiej pasować co dodano kwas (na przykład begin, end, rbegini renddodaje się std::stringtak, aby mogła być wykorzystana jako pojemniku). Mniej więcej w tym samym czasie większość biblioteki (nawet fragmenty, które były całkowicie niezwiązane) została przekształcona w szablony, aby pomieścić różne typy (np. Standardowe strumienie).

Niektóre osoby używają również STL jako krótkiej formy „STandard Library”.

Oznacza to, że gdy ktoś używa terminu „STL”, może odnosić się do dowolnej z kilku różnych rzeczy. Na lepsze lub gorsze, większość osób, które go używają, wydaje się ignorować wielość znaczeń i zakłada, że ​​wszyscy inni rozpoznają to, do czego się odnoszą. Prowadzi to do wielu nieporozumień i co najmniej kilku poważnych wojen płomieni, które sprawiły, że większość uczestników wyglądała na głupców, ponieważ mówili po prostu o zupełnie innych sprawach.

Niestety zamieszanie prawdopodobnie będzie trwało bez końca. O wiele wygodniej jest odnosić się do „STL” niż do czegoś w rodzaju „kontenerów, iteratorów i algorytmów w standardowej bibliotece C ++, ale nie obejmuje std::string, nawet jeśli może działać jak kontener”. Mimo że „standardowa biblioteka C ++” nie jest tak długa i niezgrabna, „STL” wciąż jest o wiele krótsza i prostsza. Dopóki ktoś nie wymyśli terminów, które są bardziej precyzyjne (w razie potrzeby) i równie wygodne, „STL” będzie nadal używane, a zamieszanie będzie nadal skutkować.


5
@Jerry: Były; właśnie to oznacza „std”. :)
Wyścigi lekkości na orbicie

6
@Jerry: Nie jestem pewien, skąd się biorą przestrzenie nazw. Zgodne implementacje nie dodają niczego do przestrzeni nazw std. Mówiłem o „std” w „stdlib”, co oznacza „standard”. Myślę, że to całkiem jasne, co to oznacza!
Wyścigi lekkości na orbicie

3
@Jerry: Naprawdę nie sądzę, że trudno jest oczekiwać, że ktoś przeczyta przymiotnik „standard”, ponieważ „to jest w standardzie”. Tymczasem 17.4.3.1/1 jest całkiem jasne, że dodawanie elementów do przestrzeni nazw stdjest UB, z wyjątkiem niektórych konkretnych nazwanych przypadków: te przypadki dodawania są nazwane w standardzie, a zatem są w pełni zgodne; nadal obowiązywałaby „standardowa”.
Wyścigi lekkości na orbicie

1
Historia SGI i HP tutaj jest wstecz. Stepanov był w HP, zanim był w SGI.
Kragen Javier Sitaker

2
Po prostu ponownie przeczytałem tutaj komentarze i pomyślałem, że warto dodać jeszcze jeden (co prawda drobny) punkt: Myślę, że trochę trudno jest oczekiwać, że „standard” zawsze oznacza „to jest w standardzie”. W szczególności, wielu programistów C ++ posłużył się terminem „standardowej biblioteki” na długo zanim tam było standardem. Aby ktoś nie pomyślał, że odnoszą się do biblioteki w standardzie C, zaznaczę, że to samo dotyczyło programistów C na długo przed powstaniem (nawet szkicem) standardu C.
Jerry Coffin,

52

Termin „STL” lub „Standardowa biblioteka szablonów” nie pojawia się nigdzie w standardzie ISO 14882 C ++. Odwołanie się do standardowej biblioteki C ++ jako STL jest błędne. Termin „biblioteka standardowa C ++” lub „biblioteka standardowa” jest oficjalnie używany przez ISO 14882:

Norma ISO 14882 C ++:

17 - Wprowadzenie do biblioteki [lib.library]:

  1. W niniejszych klauzulach opisano zawartość Standardowej Biblioteki C ++ , w jaki sposób dobrze sformatowany program C ++ korzysta z biblioteki oraz w jaki sposób zgodna implementacja może zapewnić elementy w bibliotece.

...

STL to biblioteka pierwotnie zaprojektowana przez Aleksandra Stepanowa, niezależna od standardu C ++. Jednak niektóre elementy biblioteki standardowej C ++ STL zawierać składniki takie jak vector, listi algorytmów, jak copyi swap.

Ale oczywiście standard C ++ zawiera znacznie więcej rzeczy poza STL, więc termin „biblioteka standardowa C ++” jest bardziej poprawny (i jest tak naprawdę używany w dokumentach standardów).


5
+1. Chociaż w STL nie było stdprzestrzeni nazw (IIRC).
Wyścigi lekkości na orbicie

1
W tym czasie większość kompilatorów C ++ nie implementowała przestrzeni nazw. W rzeczywistości nie wiem, czy były nawet w standardzie.
Kragen Javier Sitaker

3
@Kragen: Cóż, nie było standardu.
Wyścigi lekkości na orbicie

3
O. Cóż, były książki Stroustrupa, ale przypuszczam, że to nie to samo, prawda?
Kragen Javier Sitaker

23

Niedawno wypowiedziałem ten sam argument, ale uważam, że można pozwolić na małą tolerancję. Jeśli Scott Meyers popełnia ten sam błąd, masz dobre towarzystwo.


@Tomalak & @Mark: Właściwie to -1ode mnie Scott nie . Książka rzeczywiście dotyczy STL w znaczeniu „części standardowej biblioteki z biblioteki Stepanowa”. Poświęć trochę czasu na przejrzenie książek Spis treści. Jedyną rzeczą, którą mogłem znaleźć poza oryginalnym STL, było to std::string, że został wyposażony w pełnowymiarowy pojemnik STL.
sbi

@sbi: Najwyraźniej źle zinterpretowałeś moją pozycję. Nie użyłbym „STL” w sposób, który robi Scott. Proszę przeczytać moją odpowiedź.
Wyścigi lekkości na orbicie

6
@Tomalak, nie używałbym również „STL” w ten sposób, chociaż prawdopodobnie byłem winny tego w przeszłości. Po prostu nie sądzę, że warto pokonać ludzi.
Mark Ransom

1
Które mogę uszanować. Najbardziej niepokoję się o ludzi, którzy w ogóle nie uznają potencjalnej dwuznaczności. :)
Wyścigi lekkości na orbicie

11
Będziesz także w towarzystwie Bjarne Stroustrup - ref. na przykład. stroustrup.com/DnE2005.pdf : „STL („ Standardowa biblioteka szablonów ”; tzn. struktura kontenerów i algorytmów biblioteki standardowej ISO C ++)”
Sander De Dycker

7

Z biblioteki GNU Standard C ++ (libstdc ++) FAQ :


STL (Standardowa biblioteka szablonów) była inspiracją dla dużych fragmentów standardowej biblioteki C ++, ale warunki nie są wymienne i nie oznaczają tego samego. Biblioteka standardowa C ++ zawiera wiele rzeczy, które nie pochodzą z STL, a niektóre z nich nie są nawet szablonami, takimi jak std::localei std::thread.

Libstdc ++ - v3 zawiera dużo kodu z SGI STL (ostateczne scalenie nastąpiło od wydania 3.3 ). Kod w libstdc ++ zawiera wiele poprawek i zmian w porównaniu do oryginalnego kodu SGI.

W szczególności stringnie pochodzi od SGI i nie korzysta z ich klasy „lina” (chociaż jest to uwzględnione jako rozszerzenie opcjonalne), ani nie jest, valarrayani niektóre inne. Klasy podobne vector<>były z SGI, ale zostały znacznie zmodyfikowane.

Więcej informacji na temat ewolucji libstdc ++ można znaleźć w dokumentacji API ewolucji i wstecznej kompatybilności .

FAQ dla SGI STL nadal zaleca czytanie.


Do Twojej wiadomości, od marca 2018 r. Zniknęła nawet oficjalna strona internetowa STL www.sgi.com/tech/stl/ .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.