2015-07-29 17 views
7

Ostatnio pracuję nad projektem C++, któremu nie wolno używać standardowej biblioteki szablonów ani żadnych innych szablonów.Standardowy kontener C++ i kontener STL w C++

Jestem trochę zdezorientowany po tym, jak zrobiłem jakieś badania. Jakie pojemniki należą do biblioteki standardowej, a inne należą do standardowej biblioteki szablonów? Lub nie mówimy o pojemniku na standardową bibliotekę, prawda?

Czy wektor jest kontenerem, czy nie? Czy wektor jest klasą dla biblioteki standardowej czy należy do STL?

Mam nadzieję, że zaimplementuję listę niektórych struktur w standardowej bibliotece, czy mogę użyć listy lub wektora?

+2

O ile mi wiadomo, to, co kiedyś było znane jako STL, jest częścią standardowej biblioteki C++. Nie ma już kontenera STL. Są tylko częścią standardowej biblioteki C++. –

+0

Dziękuję Rahah. Myślę, że powodem, dla którego czasami nie używamy STL, jest to, że kosztuje więcej pamięci. Tak jak używamy mapy, pamięć każdego elementu jest ciągła. Tak więc zastanawiam się, kiedy ludzie mówią, że nie używają STL, oznacza to użycie klasy/struktury/kontenera, który oszczędziłby pamięć. – leon

+1

Oczywiście, zależy to od projektu, czy ma sens korzystanie z pewnych części standardowej biblioteki, czy nie, a tak naprawdę jest kilka przypadków, w których nie chcesz ich używać. Ale mam wrażenie, że czasami jest to jedna z najgorszych form przedwczesnej optymalizacji. –

Odpowiedz

9

Nic w bibliotece standardowej C++ "należy" do STL. STL jest inną biblioteką, która tylko wpłynęła na wiele części w Bibliotece Standardowej C++. Z tagu wiki:

[STL] to biblioteka C++ generycznych kontenerów, iteratorów, algorytmów, i obiektów funkcji. Kiedy C++ została znormalizowana, duże części STL zostały przyjęte do biblioteki standardowej, [...]

Jednak wiele osób odnosi się do C++ Standard Library jako Standard Template Library, która nie jest całkowicie poprawna . Zgaduję, że jeśli nie możesz używać STL, oznacza to, że nie wolno Ci korzystać z Biblioteki Standardowej C++. Ale musiałbyś poprosić ich, aby wiedzieli, co naprawdę znaczą.

Aby uzyskać więcej informacji, zobacz What's the difference between "STL" and "C++ Standard Library"?

3

moim zdaniem rozróżnienie między STL i C++ Standardowa biblioteka jest nieco podobna do relacji między Linux i GNU/Linux:

Historycznie, STL był rdzeń (w tym pojemniki, algorytmy i iteratory itp.), a standardowa biblioteka jest metaforycznie kompletnym systemem operacyjnym zbudowanym wokół rdzenia wyposażającego wszystko inne. Standardowa biblioteka dokonała modyfikacji na górze STL, ale ta część standardowej biblioteki ma swoje korzenie w STL. (Pamiętasz, jak ciężko ludzie GNU próbowali nam przypomnieć, że Linux jest tylko jądrem i nalegać na wywołanie OS GNU/Linux?)

Jeśli standardowa komisja pisała papier zamiast standardu C++, prawdopodobnie trzeba potwierdzić, że w całej nakładającej się domenie jest wszędzie STL, zamiast zgłaszać różnice.

Jak zauważył w komentarzach w this answer Bjarne Stroustrup, wynalazca C++, described STL jak

STL (dalej "Standard Template Library", to jest, pojemniki i algorytm ramach ISO C++ biblioteki standardowej)

Co więcej, stanowi istotę STL, który został wprowadzony do biblioteki standardowej jest koncepcja, że ​​każdy algorytm STL musi mieć wcześniej określoną najgorszy przypadek złożoność algorytmiczna, co czyni go nieistotną sprawą, która implementuje STL.Trzeba tylko zwrócić uwagę na specyfikację kontenera lub algorytmu STL, historycznie umieszczonego na stronie SGI wśród innych źródeł. Było to dość ważne w czasach prehistorycznych, kiedy każdy mógł wymyślić własne pojemniki o różnych złożonościach obliczeniowych.

Do innych ważnych funkcji STL wprowadzonych do biblioteki standardowej należy nowy paradygmat programowania funkcjonalnego, jaki został urzeczywistniony w obecnym <algorithm> i wszędzie indziej, co, moim zdaniem, zrewitalizowało C++ jako język, uzupełniając tradycyjny paradygmat programowania obiektowego.

W tym sensie iz powrotem na swoje pytanie, myślę, że to tylko sprawiedliwe, by powiedzieć, że pojemniki jak vector należą do STL (pierwotnie) i biblioteki standardowej.

+0

Nie - STL nie był niczym innym jak rdzeniem. Był to spóźniony dodatek, wypychający pierwszy standard z powrotem około 2 lat (1996-> 1998). Ponadto, Standard musiał dokładnie udokumentować, w jaki sposób powinny działać składniki ** **, aby umożliwić alternatywne implementacje. – MSalters

+0

STL odsuwa standard? To dziwny sposób patrzenia na to. Jeśli pojemniki STL, algorytmy i związana z nimi specyfikacja złożoności algorytmicznej nie były materiałem rdzeniowym, dlaczego standaryzacja wydała w przybliżeniu. dwa lata, aby go włączyć? Czy dwa lata spędził więcej czasu na poprawę STL lub na negocjacjach, czy nowe funkcje w STL były zbyt duże dla C++? – tinlyx

+0

Firma STL otrzymała specyfikacje o złożoności i miała alternatywne implementacje, zanim została włączona do standardu. – tinlyx

2

We wczesnych latach 90-tych nie było bibliotek kolekcji w C++. Ludzie używali składników RogueWave, Booch lub czegoś innego, o czym zapomniałem. Dlatego widzisz klasy takie jak QList w QT, ponieważ czegoś potrzebowali.

W tym czasie SGI posiadało bibliotekę kolekcji, którą wielu widziało i komu się podobało. Oparli bibliotekę kolekcji, o którą prosili wielu ludzi i nazwali ją STL.

Na dzień dzisiejszy powiedziałbym składnik biblioteki, w którym użytkownik jawnie stworzył, że jest częścią STL. Aby wyjaśnić, użytkownik będący użytkownikiem std :: vector musi określić, co zawiera, tj. Std :: vector (1) oznacza to, że jest on częścią STL. OTOH nie musisz tworzyć instancji fstream, nawet jeśli jest to typedef czegoś podobnego do basic_fstream.

Jeśli chodzi o efektywność, STL jest bardzo szczupła i średnia, dzięki pisarzom, którzy są ekspertami w takich dziedzinach jak specjalizacja i TMP. Czy mogę napisać coś, co lepiej pasuje do mojego celu. Mógłbym za miesiąc napisać coś, co działa o 1% lepiej dla moich potrzeb, ale czy warto?

BTW oprócz wywołań systemu operacyjnego i wywołań C, cała biblioteka C++ jest szablonowana, chociaż (tak jak w przypadku fstream) może nigdy nie być widoczna. Dlatego zakazują większości bibliotek C++.

(1) BTW Myślę, że podejście STL było najlepsze. Inne kolekcje wymagały od ciebie takich rzeczy, jak czerpanie z klasy bazowej Kolekcjonerstwo lub coś w tym stylu.

+0

Stepanov i Lee byli w HP, kiedy opracowali STL. [Źródło] (https://www.sgi.com/tech/stl/drdobbs-interview.html) – MSalters

0

Dziękuję za wszystkie odpowiedzi na moje pytanie. Niektóre własne rozumienie tego problemu: 1. Gdy wymagane jest rozwijanie bez STL lub innej biblioteki szablonów, można używać tylko biblioteki takiej jak ,,. Możesz użyć tylko wskaźnika, łańcucha (może tylko znaku) i klasy w swoim programie, co oznacza, że ​​musisz zdefiniować własną strukturę danych. 2. Celem nieużywania STL jest sprawdzenie twojego zrozumienia podstawowej operacji w C++, takich jak nowy/delete, wskaźnik i klasa. Innym celem, o którym myślę, jest oszczędzanie pamięci. Zmierzyłem się z tym problemem podczas wywiadu. Mam nadzieję, że pomogłoby ci, gdybyś zmierzył się z tą samą sprawą, z którą miałem do czynienia.

Powiązane problemy