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?
Odpowiedzi:
„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.
źródło
std::iota
jest 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.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
,rbegin
irend
dodaje sięstd::string
tak, 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ć.źródło
std
. Mówiłem o „std” w „stdlib”, co oznacza „standard”. Myślę, że to całkiem jasne, co to oznacza!std
jest 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”.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:
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
,list
i algorytmów, jakcopy
iswap
.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).
źródło
std
przestrzeni nazw (IIRC).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.
źródło
-1
ode 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 tostd::string
, że został wyposażony w pełnowymiarowy pojemnik STL.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::locale
istd::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
string
nie pochodzi od SGI i nie korzysta z ich klasy „lina” (chociaż jest to uwzględnione jako rozszerzenie opcjonalne), ani nie jest,valarray
ani niektóre inne. Klasy podobnevector<>
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/ .
źródło