“STL” ve “C ++ Standart Kütüphane” arasındaki fark nedir?


446

Birisi bu makaleyi dikkat çektiğimde , STL teriminin SGI STL'den alınan parçalar yerine tüm C ++ Standart Kütüphanesine atıfta bulunmak için yanlış kullanıldığını iddia ediyorum .

(...) hala çok az insanın (SGI'de tasarlanan) STL'yi kullanmasına rağmen "STL" yi ifade eder.

C ++ Standart Kütüphanesinin bölümleri STL'nin bölümlerine dayanıyordu ve bu bölümler birçok kişinin (çeşitli yazarlar ve kötü şöhretli olarak basmış cplusplus.com dahil) hala "STL" olarak adlandırdığı bölümlerdir. Ancak, bu yanlıştır; aslında, C ++ standardı hiçbir zaman "STL" den bahsetmez ve ikisi arasında içerik farklılıkları vardır.

(...) "STL", nadiren SGD STL'ye dayanan stdlib bitlerine atıfta bulunmak için kullanılır. İnsanlar bunun standart kütüphanenin tamamı olduğunu düşünüyor. Özgeçmiş alır. Ve yanıltıcı.

C ++ 'ın geçmişi hakkında pek bir şey bilmiyorum, bu yüzden makalenin doğruluğunu yargılayamıyorum. STL terimini kullanmaktan kaçınmalı mıyım? Yoksa bu izole bir görüş mü?


62
İnsanlar bir şeyleri tanımlamak için iyi isimlere ihtiyaç duyar. Stepanov'un dehası program yapma şeklimizi değiştirdi. "Standart kütüphane programlama" gibi bir isim bunu tanımlamak için tamamen işe yaramaz. Buna "stl programlama" deyin ve herkes ne demek istediğinizi biliyor. Bunu tartışmak sadece noktayı kaçırıyor: iyi bir isme ihtiyacımız var.
Hans Passant

34
@Hans: Hayır, sen kaçırıyorlar " herkes ne demek istediğini bilir" olduğunu doğru değil .
Yörüngede Hafiflik Yarışları

16
Ne demek istediğin hakkında hiç bir fikrim yok.
Hans Passant

21
Buraya tüm C ++ Standart Kitaplığı'na başvurmak için "STL" kullanan birine mükemmel bir örnek. Bu kadar çok insanın neredeyse günlük olarak görmek basit olduğunda kimsenin bunu yapmadığı için küfür ettiğine şaşırmaya devam ediyor.
Yörüngedeki Hafiflik Yarışları

Yanıtlar:


571

"STL" Alexander Stepanov tarafından C ++ standardize edilmeden çok önce yazılmıştır . C ++, 80'ler boyunca mevcuttu, ancak şimdi " C ++ " olarak adlandırdığımız şey, ISO / IEC 14882: 2014'te (ve ISO / IEC 14882: 2011 gibi önceki sürümlerde) standartlaştırılan dildir.

STL zaten C ++ için bir kütüphane olarak yaygın olarak kullanıldı ve programcılara kapsayıcılara, yineleyicilere ve algoritmalara erişim sağladı. Standardizasyon gerçekleştiğinde bu dil komitesi tasarlanmış parçaları için (dil standardının parçasıdır) C ++ Standart Kütüphanesi çok yakından STL maç.

Yıllar boyunca, önde gelen kitap yazarları ve çeşitli web siteleri de dahil olmak üzere birçok insan, iki varlığın ayrı olmasına ve bazı farklılıklar olmasına rağmen, C ++ Standart Kütüphanesine "STL" adını vermeye devam etmiştir. Bu farklılıklar, çeşitli özellikler içeren ve bazı sınıfları önemli ölçüde değiştiren yeni C ++ standardında daha da belirgindir.

Özgün STL'ye artık Microsoft Visual Studio veya GCC'niz C ++ Standart Kitaplığı'nın bir uygulamasıyla aynı şekilde "C ++ Standart Şablon Kitaplığı'nın bir uygulaması" (gerçek tarihe geri döndü!) Denir. Ancak "Standart Şablon Kütüphanesi" ve "Standart Kütüphane" aynı şey değildir.

Savaş, mevcut Standart Kütüphanenin tamamen veya kısmen "STL" olarak adlandırılıp adlandırılmayacağı ve / veya bunun ne denli önemli olduğuyla ilgilidir.

"STL" için

Herkesin "STL" nin standart kütüphane anlamına geldiğini bildiğini söyleyen bir düşünce okulu var, tıpkı herkesin "C ++" nın ISO standardize edilmiş dil olduğunu bildiği gibi.

Ayrıca , tüm taraflar neyin konuşulduğunu anladığı sürece bunun gerçekten önemli olmadığına inananları da içerir .

Birçoğu "şablonlar" olarak bilinen C ++ özelliğini yoğun olarak kullanan canavarın doğasıyla daha da yaygınlaşan bir terimdir.

"C ++ Standart Kütüphane" (veya stdlib) için

Ancak, abone olduğum başka bir düşünce okulu var, bunun kafa karıştırıcı olduğunu söylüyor. C ++ 'ı ilk kez öğrenen insanlar yok bu ayrımı biliyorum ve küçük dil farklılıkları fark olmayabilir.

Bu makalenin yazarı, tüm C ++ Standart kütüphane inanıyoruz insanlar karşılaştı defalarca vardır olduğunu hiçbir zaman STL'nin kendisinin bir parçası olmayan özellikler de dahil olmak üzere STL . "STL" nin vokal savunucularının çoğu, bunun aksine, ne demek istediklerini tam olarak bilir ve herkesin "yakalayamadığına" inanmayı reddeder. Açıkçası, terimin kullanımı tekdüze değildir.

Ayrıca, C ++ Standart Kütüphanesi değil, aslında orijinal STL'nin uygulamaları olan bazı STL benzeri kütüphaneler vardır. Yakın zamana kadar STLPort bunlardan biriydi (ve hatta orada, karışıklık bol!).

Ayrıca, C ++ Standardı hiçbir yerde "STL" metnini içermez ve bazı kişiler alışkanlık olarak "STL dahildir C ++ Standart Kütüphanesine edilir bu yanlıştır.

İnanıyorum ki, terimin kullanımını bu şekilde yaymaya devam etmek, yanlış anlamaların sonsuza dek sürmesine yol açacaktır. Ne yazık ki, daha iyisi için olması gerekse bile, bir şeyleri değiştirmeye çalışmak tamamen karşı üretken olabilir. Sonsuza dek çift anlamlarla sıkışıp kalabiliriz.

Sonuç

Bu yazının biraz önyargılı olduğunu takdir ediyorum: Bağlantı verdiğiniz makaleyi yazdım. Her neyse, umarım bu savaşı biraz daha iyi açıklamaya yardımcı olur.

Güncelleme 13/04/2011

İşte tüm C ++ Standart Kitaplığı'na başvurmak için "STL" kullanan birinin mükemmel üç örneği . Bu kadar çok insanın neredeyse günlük olarak görmek basit olduğunda kimsenin bunu yapmadığı için küfür ettiğine şaşırmaya devam ediyor.


136
S tandard T emplate L ibrary sadece tarafından oluşturulmamış Aziz epanov ve L ee, ama aynı zamanda en çalışıyorlardı S oftware T echnology L anda aboratory.
Kragen Javier Sitaker

21
Bugün birisi hangi başlığın içinde std::iotaolduğunu sordu , çünkü işe yaramadı. SGI standart olmayan bir uzantıdır , "STL" olduğu için onlara uygun olduğunda "standart" olarak adlandırırlar ve herkes "STL" nin C ++ Standart Kütüphanesinin bir parçası olduğunu bilir, değil mi? Ve C ++ 0x'de tanıtıldı, ancak C ++ 03'te mevcut değil. Grrr.
Yörüngedeki Hafiflik Yarışları

40
MS STL, S tephan T tarafından muhafaza edilmektedir . L avavej, aka STL.
Mihaela


26
Bjarne Stroustrup, STL'yi "canon", C ++ Programlama Dili 4. Baskıdaki Standart Kütüphanenin diğer bölümlerinden ayırır.
codenheim

84

Gerçekten doğru olan tek bir cevap yok. Alexander Stepanov, STL adında bir kütüphane geliştirdi (o sırada HP için çalışıyor). Bu kütüphane daha sonra C ++ standardına dahil edilmek üzere önerildi.

Bu temelde "çatallı" gelişme. Komite bazı bölümleri içeriyordu, diğerlerini tamamen reddetti ve birkaçını yeniden tasarladı (Alexander'ın katılımıyla). Orijinal kütüphanenin geliştirilmesi daha sonra Silicon Graphics'e taşındı, ancak C ++ standart kütüphanesinden ayrı olarak devam etti.

Bu parçalar standart kütüphanesine eklenmiştir sonra standart kütüphanenin diğer bazı kısımları daha iyi eklendi şeyle uyacak şekilde modifiye edilmiş (örneğin begin, end, rbeginve rendeklenmiş std::stringbir kap gibi kullanılabilir böylece). Aynı zamanda, kütüphanenin çoğu ( tamamen ilgisiz olan parçalar bile ) farklı türlere (örneğin standart akışlara) uyum sağlamak için şablonlara dönüştürülmüştür.

Bazı insanlar STL'yi "STandard Kütüphanesi" nin kısa bir biçimi olarak da kullanırlar.

Bu, biri "STL" terimini kullandığında, yaklaşık yarım düzine farklı şeyden herhangi birine atıfta bulunabileceği anlamına gelir. Daha iyisi ya da daha kötüsü, onu kullanan çoğu insan anlamların çokluğunu görmezden geliyor ve herkesin neyi kastettiklerini tanıyacağını varsayıyor. Bu, birçok yanlış anlama ve katılımcıların çoğunun aptalca görünmesini sağlayan en azından birkaç ciddi alev savaşına yol açıyor çünkü sadece tamamen farklı şeyler hakkında konuşuyorlardı.

Maalesef, karışıklığın hafiflemeye devam etmesi muhtemeldir. "STL" ye, "C ++ standart kütüphanesindeki kaplar, yineleyiciler ve algoritmalar gibi bir şeyden daha çok atıfta bulunmak, ancak std::stringkap gibi davranmasına rağmen dahil etmemek çok daha uygundur . "C ++ standart kütüphanesi" bu kadar uzun ve beceriksiz olmasa da, "STL" hala çok daha kısa ve basittir. Biri daha kesin (gerektiğinde) ve aynı derecede uygun terimleri icat etmedikçe veya sürece , "STL" kullanılmaya devam edecek ve karışıklık ortaya çıkmaya devam edecektir.


5
@ Jerry: Birincisi; "std" nin anlamı budur. :)
Orbit'te Hafiflik Yarışları

6
@ Jerry: İsim alanlarının nereden geldiğinden emin değilim. Uyumlu uygulamalar ad alanına hiçbir şey eklemez std. "Standart" anlamına gelen "stdlib" deki "std" hakkında konuşuyordum. Bunun ne anlama geldiğini çok açık düşünüyorum!
Yörüngede Hafiflik Yarışları

3
@ Jerry: Gerçekten birinin "standart" sıfat "standart" sıfat okumak için bir streç olduğunu sanmıyorum. Bu arada, 17.4.3.1/1 isim alanına bir şeyler eklemenin stdbazı özel adlandırılmış durumlar dışında UB olduğu oldukça açıktır: bu ekleme vakaları standartta adlandırılır ve bu nedenle hala mükemmel şekilde uyumludur; "standart" yine de geçerlidir.
Orbit'te Hafiflik Yarışları

1
Burada SGI ve HP'nin geçmişi geriye dönük. Stepanov, SGI'da bulunmadan önce HP'deydi.
Kragen Javier Sitaker

2
Ben sadece burada yorumları tekrar okudum ve bir (kuşkusuz küçük) nokta eklemeye değer olduğunu düşündüm: Ben her zaman "bu standart" demek için "standart" beklemek için bir streç biraz olduğunu düşünüyorum. Özellikle, birçok C ++ programcıları orada çok önce ifade "standart kütüphane" kullanılmış oldu standart. Birinin C standardındaki kütüphaneye atıfta bulunduklarını düşünürsem, bir C standardı (hatta bir taslak) olmadan önce aynı şeyin C programcıları için de geçerli olduğunu belirteceğim.
Jerry Coffin

52

"STL" veya "Standart Şablon Kütüphanesi" terimi, ISO 14882 C ++ standardının hiçbir yerinde görünmez. C ++ standart kitaplığına STL olarak atıfta bulunmak yanlıştır. "C ++ Standart Kütüphane" veya "standart kütüphane" terimi, ISO 14882 tarafından resmi olarak kullanılan terimdir:

ISO 14882 C ++ Standardı:

17 - Kütüphane tanıtımı [lib.library]:

  1. Bu hükümler, C ++ Standart Kitaplığı'nın içeriğini, iyi biçimlendirilmiş bir C ++ programının kitaplığı nasıl kullandığını ve uygun bir uygulamanın kitaplıktaki varlıkları nasıl sağlayabileceğini açıklar .

...

STL başlangıçta Alexander Stepanov tarafından C ++ standardından bağımsız olarak tasarlanmış bir kütüphanedir. Bununla birlikte, C ++, standart kütüphanenin bazı bileşenler STL gibi bileşenler içerir vector, listve bu gibi algoritmalar copyveswap .

Ancak elbette C ++ standardı STL dışında çok daha fazla şey içerir, bu nedenle "C ++ standart kütüphane" terimi daha doğrudur (ve standart belgeler tarafından gerçekte kullanılan şeydir).


5
+1. Bununla birlikte, stdSTL'de isim alanı (IIRC) yoktu .
Orbit'te Hafiflik Yarışları

1
O zaman, çoğu C ++ derleyicisi ad alanları uygulamadı. Aslında standartta olup olmadıklarını bilmiyorum.
Kragen Javier Sitaker

3
@Kragen: Standart yoktu.
Yörüngedeki Hafiflik Yarışları

3
Ah. Stroustrup'un bazı kitapları vardı, ama sanırım bu aynı şey değil, değil mi?
Kragen Javier Sitaker

23

Son zamanlarda aynı argümanı yaptım, ama biraz toleransa izin verilebileceğine inanıyorum. Eğer Scott Meyers aynı hatayı yaparsa, iyi bir şirkettesiniz.


@Tomalak & @Mark: Aslında Scott -1benden değil . Kitap gerçekten de STL hakkında "Stepanov'un kütüphanesinden kaynaklanan std lib bölümleri" anlamında. TOC kitaplarına bakmak için zaman ayırın. Orijinal STL'nin dışında bulabildiğim tek şey std::string, tam dolu bir STL konteyneri olacak şekilde donatılmıştı.
sbi

@sbi: Konumumu açıkça yanlış yorumladın. Scott'ın yaptığı gibi "STL" yi kullanmam. Lütfen cevabımı okuyun.
Orbit'te Hafiflik Yarışları

6
@Tomalak, "STL" yi de bu şekilde kullanmazdım, ancak geçmişte muhtemelen suçluyum. Sadece insanları dövdüğünü sanmıyorum.
Mark Ransom

1
Saygı duyabileceğim. Potansiyel belirsizliği kabul etmeyi reddeden insanlar hakkında en çok endişeleniyorum. :)
Yörüngedeki Hafiflik Yarışları

11
Ayrıca Bjarne Stroustrup - ref. Örneğin. stroustrup.com/DnE2005.pdf : "STL (" Standart Şablon Kütüphanesi "; ISO C ++ standart kütüphanesinin kapsayıcıları ve algoritma çerçevesi)"
Sander De Dycker

7

Gönderen GNU standart C ++ Kitaplığı (libstdc ++) SSS :


STL (Standart Şablon Kütüphanesi), C ++ Standart Kütüphanesinin büyük parçaları için ilham kaynağıydı, ancak terimler birbirinin yerine kullanılamaz ve aynı şey anlamına gelmez. C ++ Standart kütüphane STL gelmedi pek çok şey içerir ve bunların bazıları gibi hatta şablonları değildir std::localeve std::thread.

Libstdc ++ - v3 , SGI STL'den çok sayıda kod içeriyor (son birleştirme 3.3 sürümünden alındı. ). Libstdc ++ 'da kod, orijinal SGI koduna kıyasla birçok düzeltme ve değişiklik içerir.

Özellikle, stringSGI'dan değildir ve "halat" sınıflarını kullanmaz (isteğe bağlı bir uzantı olarak dahil edilmesine rağmen), ne ne valarrayde diğerleri. Gibi sınıflarvector<> SGI, ama yoğun olarak değiştirildi.

Libstdc ++ 'ın evrimi hakkında daha fazla bilgi API evriminde ve geriye dönük uyumlulukta bulunabilir belgelerinde bulunabilir.

SGI'nın STL'sine ilişkin SSS'nin okunması önerilir.


FYI, Mart 2018 itibariyle www.sgi.com/tech/stl/ resmi STL web sitesi bile gitti .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.