อะไรคือความแตกต่างระหว่าง“ STL” และ“ ไลบรารีมาตรฐาน C ++”?


446

มีคนนำบทความนี้ไปสู่ความสนใจของฉันที่อ้างว่า(ฉันถอดความ)คำ STL ถูกนำไปใช้ในทางที่ผิดเพื่ออ้างถึงทั้งห้องสมุดมาตรฐาน C ++ แทนส่วนที่นำมาจาก SGI STL

(... ) มันหมายถึง "STL" แม้จะมีคนเพียงไม่กี่คนที่ยังใช้ STL (ซึ่งได้รับการออกแบบที่ SGI)

บางส่วนของ C ++ Standard Library นั้นขึ้นอยู่กับส่วนของ STL และเป็นส่วนเหล่านี้ที่หลายคน (รวมถึงผู้แต่งหลายคนและ cplusplus.com ซึ่งมีข้อผิดพลาดอย่างฉาวโฉ่ยังคงเรียกว่า "the STL" อย่างไรก็ตามนี่ไม่ถูกต้อง จริง ๆ แล้วมาตรฐาน C ++ ไม่เคยกล่าวถึง "STL" และมีความแตกต่างของเนื้อหาระหว่างทั้งสอง

(... ) "STL" ไม่ค่อยถูกใช้เพื่ออ้างถึงบิตของ stdlib ที่เกิดขึ้นกับ SGI STL ผู้คนคิดว่ามันเป็นห้องสมุดมาตรฐานทั้งหมด มันได้รับการใส่ CV และมันก็ทำให้เข้าใจผิด

ฉันแทบไม่รู้อะไรเลยเกี่ยวกับประวัติของ C ++ ดังนั้นฉันจึงไม่สามารถตัดสินความถูกต้องของบทความได้ ฉันควรละเว้นจากการใช้คำว่า STL หรือไม่ หรือนี่เป็นความเห็นที่แยกต่างหาก


62
ผู้คนต้องการชื่อที่ดีเพื่ออธิบายสิ่งต่าง ๆ อัจฉริยะของ Stepanov เปลี่ยนวิธีการเขียนโปรแกรมของเรา ชื่อเช่น "การเขียนโปรแกรมไลบรารีมาตรฐาน" นั้นไม่มีประโยชน์อย่างที่สุดที่จะอธิบายสิ่งนั้น เรียกว่า "การเขียนโปรแกรม stl" และทุกคนรู้ว่าคุณหมายถึงอะไร การโต้เถียงเกี่ยวกับสิ่งที่เพิ่งพลาดจุด: เราต้องการชื่อที่ดี
Hans Passant

34
@Hans: ไม่มีคุณพลาดจุด: " ทุกคนรู้ว่าสิ่งที่คุณหมายถึง" คือไม่เป็นความจริง
การแข่งขัน Lightness ใน Orbit

16
ฉันไม่รู้ว่าคุณหมายถึงอะไร
Hans Passant

21
นี่คือตัวอย่างที่สมบูรณ์แบบของคนที่ใช้ "the STL" เพื่ออ้างอิงถึง C ++ Standard Library ทั้งหมด มันทำให้ฉันงุนงงจนคนจำนวนมากสาบานตาบอดว่าไม่มีใครทำเช่นนี้เมื่อมันเห็นเป็นประจำทุกวัน
Lightness Races ในวงโคจร

คำตอบ:


571

"STL" ถูกเขียนโดย Alexander Stepanovในไม่กี่วันก่อนที่ 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 ++ แต่ "ไลบรารีแม่แบบมาตรฐาน" และ "ห้องสมุดมาตรฐาน" นั้นไม่เหมือนกัน

การต่อสู้นั้นเกี่ยวกับว่าห้องสมุดมาตรฐานปัจจุบันควรจะเรียกว่า "the STL" ทั้งหมดหรือบางส่วนและ / หรือไม่ว่าจะเป็นสิ่งที่เรียกว่า

สำหรับ "STL"

มีโรงเรียนแห่งความคิดที่บอกว่าทุกคนรู้แล้วว่า "STL" หมายถึงห้องสมุดมาตรฐานเช่นเดียวกับที่ทุกคนรู้ว่า "C ++" เป็นภาษาที่ได้มาตรฐาน ISO

นอกจากนี้ยังรวมถึงผู้ที่เชื่อว่ามันจะไม่สำคัญตราบใดที่ทุกฝ่ายเข้าใจสิ่งที่กำลังพูดถึง

มันเป็นคำที่สร้างความแพร่หลายมากขึ้นโดยธรรมชาติของสัตว์ร้ายซึ่งส่วนใหญ่ใช้คุณลักษณะ C ++ อย่างหนักที่รู้จักกันในชื่อ "เทมเพลต"

สำหรับ "ไลบรารีมาตรฐาน C ++" (หรือ stdlib)

อย่างไรก็ตามมีโรงเรียนแห่งความคิดอีกแห่งหนึ่งซึ่งฉันสมัครไว้ซึ่งบอกว่าเรื่องนี้ทำให้เกิดความสับสน ผู้ที่เรียน C ++ เป็นครั้งแรกไม่ทราบถึงความแตกต่างนี้และอาจไม่สังเกตเห็นความแตกต่างของภาษาเล็กน้อย

ผู้เขียนบทความนั้นพบเจอหลายครั้งที่คนที่เชื่อว่าทั้ง C ++ Standard Library นั้นเป็น STL รวมถึงฟีเจอร์ที่ไม่เคยเป็นส่วนหนึ่งของ STL แกนนำเสียงส่วนใหญ่ของ "STL" ตรงกันข้ามรู้ว่าพวกเขาหมายถึงอะไรและปฏิเสธที่จะเชื่อว่าไม่ใช่ทุกคน "ได้รับ" เห็นได้ชัดว่าการใช้คำไม่สม่ำเสมอ

นอกจากนี้ยังมีไลบรารี่ที่คล้ายกับ STL บางส่วนที่ใช้งานจริงของ STL ดั้งเดิมไม่ใช่ C ++ Standard Library จนกระทั่งเมื่อไม่นานมานี้STLPortเป็นหนึ่งในนั้น (และแม้แต่ที่นั่นความสับสนก็ยังมีอยู่มากมาย!)

นอกจากนี้มาตรฐาน C ++ ไม่มีข้อความ "STL" ที่ใดก็ได้และบางคนมักใช้วลีเช่น "STL รวมอยู่ใน C ++ Standard Library" ซึ่งไม่ถูกต้องธรรมดา

ฉันเชื่อว่าการเผยแพร่การใช้คำอย่างต่อเนื่องในลักษณะนี้จะนำไปสู่ความเข้าใจผิดที่เกิดขึ้นตลอดไป อนิจจามันอาจเป็นผลดีต่อการพยายามเปลี่ยนสิ่งต่าง ๆ แม้ว่ามันควรจะดีกว่าก็ตาม เราอาจติดอยู่กับความหมายสองเท่าตลอดกาล

ข้อสรุป

ฉันขอขอบคุณที่โพสต์นี้มีอคติเล็กน้อย: ฉันเขียนบทความที่คุณเชื่อมโยง :) อย่างไรก็ตามฉันหวังว่านี่จะช่วยอธิบายการต่อสู้ได้ดีขึ้น

อัปเดต 13/4/2554

ต่อไปนี้เป็นสาม ตัวอย่างที่สมบูรณ์แบบ ของคนที่ใช้ "STL" เพื่ออ้างถึงไลบรารีมาตรฐาน C ++ ทั้งหมด มันทำให้ฉันงุนงงจนคนจำนวนมากสาบานตาบอดว่าไม่มีใครทำเช่นนี้เมื่อมันเห็นเป็นประจำทุกวัน


136
S tandard T emplate L ibrary ไม่ได้ถูกสร้างโดยเฉพาะเซนต์ epanov และL EE แต่พวกเขาก็ยังทำงานอยู่ที่S oftware T echnology L aboratory ในเวลานั้น
Kragen Javier Sitaker

21
มีใครบางคนในวันนี้ถามว่าส่วนหัวstd::iotaอยู่ในเพราะเขาไม่สามารถทำงานได้ เป็นส่วนขยายที่ไม่ได้มาตรฐานของ SGIที่พวกเขาเรียกว่า "มาตรฐาน" เมื่อมันเหมาะสมกับพวกเขาเพราะมันคือ "the STL" และทุกคนรู้ว่า "STL" เป็นส่วนหนึ่งของ C ++ Standard Library ใช่ไหม และมันถูกนำมาใช้ใน C ++ 0x แต่ไม่มีใน C ++ 03 ฮึ่ม
Lightness Races ในวงโคจร

40
และ MS STL จะดูแลโดยS tephan T L avavej, aka STL
Mihaela


26
Bjarne Stroustrup ทำให้ STL แตกต่างจากส่วนอื่น ๆ ของ Standard Library ใน "canon", The C ++ Programming Language 4th Edition
codenheim

84

ไม่มีคำตอบเดียวที่ถูกต้องจริงๆ Alexander Stepanov พัฒนาห้องสมุดที่เขาเรียกว่า STL (ทำงานให้กับ HP ในเวลานั้น) ไลบรารีนั้นถูกเสนอเพื่อรวมไว้ในมาตรฐาน C ++

นั่นคือการพัฒนาโดย "แยก" คณะกรรมการรวมบางส่วนปฏิเสธคนอื่นอย่างสมบูรณ์และออกแบบใหม่ (ด้วยการมีส่วนร่วมของอเล็กซานเดอร์) การพัฒนาไลบรารี่ดั้งเดิมนั้นถูกย้ายไปยัง Silicon Graphics แต่ต่อมาแยกจากไลบรารี่มาตรฐาน C ++

หลังจากชิ้นส่วนเหล่านั้นถูกเพิ่มเข้าไปในห้องสมุดมาตรฐานบางส่วนอื่น ๆ ของห้องสมุดมาตรฐานมีการแก้ไขเพื่อให้พอดีกับที่ดีกว่ากับสิ่งที่ถูกเพิ่มเข้ามา (เช่นbegin, end, rbeginและrendมีการเพิ่มstd::stringดังนั้นจึงสามารถนำมาใช้เช่นภาชนะ) ในช่วงเวลาเดียวกันห้องสมุดส่วนใหญ่ (แม้แต่ส่วนที่ไม่เกี่ยวข้องอย่างสมบูรณ์ ) ถูกสร้างเป็นแม่แบบเพื่อรองรับประเภทที่แตกต่างกัน (เช่นสตรีมมาตรฐาน)

บางคนใช้ STL เป็นเพียงรูปแบบสั้น ๆ ของ "STandard Library"

ซึ่งหมายความว่าเมื่อมีคนใช้คำว่า "STL" พวกเขาอาจหมายถึงสิ่งต่าง ๆ ประมาณครึ่งโหล ไม่ว่าจะดีขึ้นหรือแย่ลงคนส่วนใหญ่ที่ใช้ดูเหมือนจะเพิกเฉยต่อความหมายหลายหลากและคิดว่าทุกคนจะรับรู้ถึงสิ่งที่พวกเขาอ้างถึง สิ่งนี้นำไปสู่ความเข้าใจผิดหลายครั้งและอย่างน้อยสงครามเปลวไฟที่รุนแรงซึ่งทำให้ผู้เข้าร่วมส่วนใหญ่ดูโง่ ๆ เพราะพวกเขากำลังพูดถึงสิ่งที่แตกต่างอย่างสิ้นเชิง

น่าเสียดายที่ความสับสนมีแนวโน้มที่จะดำเนินต่อไปเรื่อย ๆ มันสะดวกกว่าในการอ้างถึง "STL" มากกว่าบางอย่างเช่น "คอนเทนเนอร์ตัววนซ้ำและอัลกอริทึมในไลบรารีมาตรฐาน C ++ แต่ไม่รวมstd::stringถึงแม้ว่ามันจะสามารถทำหน้าที่เหมือนคอนเทนเนอร์ได้" แม้ว่า "ไลบรารี่มาตรฐาน C ++" จะไม่ยาวและงุ่มง่ามเหมือนกัน แต่ "STL" ก็ยังสั้นกว่าและเรียบง่ายกว่ามาก จนกว่าจะมีใครบางคนประดิษฐ์ข้อกำหนดที่มีความแม่นยำมากขึ้น (เมื่อจำเป็น) และสะดวกเช่นเดียวกับ "STL" จะยังคงใช้งานต่อไปและความสับสนจะยังคงเกิดขึ้น


5
@Jerry: อดีต; นั่นคือสิ่งที่ "std" หมายถึง :)
Lightness Races ใน Orbit

6
@Jerry: ไม่แน่ใจว่าที่ namespaces เข้ามา การใช้งานที่สอดคล้องกับไม่ได้เพิ่มอะไรให้ stdnamespace ฉันกำลังพูดถึง "std" ใน "stdlib" ซึ่งย่อมาจาก "standard" ฉันคิดว่ามันชัดเจนว่ามันหมายถึงอะไร!
การแข่งขัน Lightness ใน Orbit

3
@Jerry: ฉันไม่คิดว่ามันเป็นเรื่องจริงที่จะคาดหวังว่าจะมีคนอ่านคำคุณศัพท์ "มาตรฐาน" เนื่องจาก "นี่เป็นมาตรฐาน" ในขณะเดียวกัน 17.4.3.1/1 ค่อนข้างชัดเจนว่าการเพิ่มสิ่งต่าง ๆ ในเนมสเปซstdคือ UB ยกเว้นในบางกรณีที่มีชื่อเฉพาะ: กรณีเพิ่มเติมเหล่านี้มีชื่ออยู่ในมาตรฐานและยังคงเป็นไปตามมาตรฐานอย่างสมบูรณ์ "มาตรฐาน" จะยังคงใช้
การแข่งขัน Lightness ที่ Orbit

1
ประวัติของ SGI และ HP ที่นี่ย้อนหลัง Stepanov อยู่ที่ HP ก่อนที่เขาจะอยู่ที่ SGI
Kragen Javier Sitaker

2
ฉันอ่านความคิดเห็นที่นี่อีกครั้งและคิดว่ามันคุ้มค่าที่จะเพิ่มอีกหนึ่งจุด (เป็นที่ยอมรับน้อย): ฉันคิดว่ามันเป็นเรื่องที่จะคาดหวังได้ว่า "มาตรฐาน" จะหมายถึง "มาตรฐาน" เสมอ โดยเฉพาะอย่างยิ่งหลาย c ++ เขียนโปรแกรมใช้วลี "ห้องสมุดมาตรฐาน" นานก่อนที่จะมีเป็นมาตรฐาน เพื่อไม่ให้ใครคิดว่าพวกเขาอ้างถึงห้องสมุดในมาตรฐาน C ฉันจะชี้ให้เห็นว่าสิ่งนี้เป็นเรื่องจริงของโปรแกรมเมอร์ C ก่อนที่จะมีมาตรฐาน (แม้แต่ร่าง) มาตรฐาน C
Jerry Coffin

52

คำว่า "STL" หรือ "ไลบรารีแม่แบบมาตรฐาน" ไม่ปรากฏที่ใดก็ได้ในมาตรฐาน ISO 14882 C ++ ดังนั้นอ้างถึงไลบรารีมาตรฐาน C ++ เนื่องจาก STL ผิด คำว่า "ไลบรารีมาตรฐาน C ++" หรือ "ห้องสมุดมาตรฐาน" คือสิ่งที่ใช้อย่างเป็นทางการโดย ISO 14882:

ISO 14882 C ++ มาตรฐาน:

17 - แนะนำห้องสมุด [lib.library]:

  1. ส่วนนี้อธิบายเนื้อหาของC ++ Standard Libraryวิธีที่โปรแกรม C ++ ที่มีรูปแบบที่ดีใช้ประโยชน์จากไลบรารีได้อย่างไรและวิธีการนำไปใช้ที่สอดคล้องกันอาจมีเอนทิตีในไลบรารีได้อย่างไร

...

STL เป็นห้องสมุดที่ออกแบบโดย Alexander Stepanov ซึ่งเป็นอิสระจากมาตรฐาน C ++ แต่บางส่วนของ C ++ ห้องสมุดมาตรฐานรวมถึงส่วนประกอบ STL เช่นvector, listและขั้นตอนวิธีเช่นและcopyswap

แต่แน่นอนว่ามาตรฐาน C ++ นั้นมีสิ่งต่าง ๆ มากมายนอกเหนือจาก STL ดังนั้นคำว่า "ไลบรารีมาตรฐาน C ++" จึงถูกต้องมากขึ้น (และเป็นสิ่งที่ใช้จริงโดยเอกสารมาตรฐาน)


5
+1 แม้ว่าใน STL ไม่มีstdnamespace (IIRC)
การแข่งขัน Lightness ใน Orbit

1
ในขณะนั้นคอมไพเลอร์ C ++ ส่วนใหญ่ไม่ได้ใช้เนมสเปซ จริงๆแล้วฉันไม่รู้ว่าพวกเขาอยู่ในมาตรฐานหรือเปล่า
Kragen Javier Sitaker

3
@ Kragen: ก็ไม่มีมาตรฐาน
Lightness Races ในวงโคจร

3
โอ้ มีหนังสือบางเล่มจาก Stroustrup แต่ฉันคิดว่ามันไม่เหมือนกันใช่มั้ย
Kragen Javier Sitaker

23

ฉันเพิ่งทำข้อโต้แย้งเดียวกันนี้เมื่อเร็ว ๆ นี้ แต่ฉันเชื่อว่าสามารถอนุญาตได้เล็กน้อย หากScott Meyersทำผิดพลาดเหมือนกันแสดงว่าคุณอยู่ใน บริษัท ที่ดี


@ Tomalak & @ Mark: จริงๆแล้ว Scott ไม่ได้ทำ-1จากฉัน หนังสือเล่มนี้เกี่ยวกับ STL ในความหมายของ "ส่วนต่างๆของ std lib ที่เกิดจากห้องสมุดของ Stepanov" ใช้เวลาในการอ่านหนังสือ TOC สิ่งเดียวที่อยู่นอกเหนือจาก STL ดั้งเดิมที่ฉันหาได้คือstd::stringและนั่นถูกติดตั้งให้เป็นคอนเทนเนอร์ STL ที่ถูกเป่าเต็ม
sbi

@sbi: คุณตีความตำแหน่งของฉันผิดอย่างชัดเจน ฉันจะไม่ใช้ "STL" ในลักษณะที่ Scott ทำ โปรดอ่านคำตอบของฉัน
การแข่งขัน Lightness ใน Orbit

6
@ Tomalak ฉันจะไม่ใช้ "STL" ในลักษณะนั้นเช่นกันแม้ว่าฉันอาจเคยทำผิดมาก่อน ฉันไม่คิดว่ามันจะคุ้มค่าที่จะเอาชนะผู้คน
Mark Ransom

1
ที่ฉันสามารถเคารพ ฉันได้รับความเดือดร้อนมากที่สุดเกี่ยวกับคนที่ปฏิเสธที่จะยอมรับความคลุมเครือที่อาจเกิดขึ้นได้ทั้งหมด :)
Lightness Races ใน Orbit

11
คุณจะอยู่ใน บริษัท ของ Bjarne Stroustrup - อ้างอิง เช่น. stroustrup.com/DnE2005.pdf : "the STL (the" Standard Template Library "นั่นคือคอนเทนเนอร์และเฟรมเวิร์กอัลกอริทึมของไลบรารีมาตรฐาน ISO C ++)"
Sander De Dycker

7

จากไลบรารี GNU Standard C ++ (libstdc ++) คำถามที่พบบ่อย :


STL (ไลบรารีเทมเพลตมาตรฐาน) เป็นแรงบันดาลใจสำหรับคลังข้อมูลขนาดใหญ่ของ C ++ Standard Library แต่คำศัพท์ไม่สามารถใช้แทนกันได้และไม่ได้หมายถึงสิ่งเดียวกัน ห้องสมุด c ++ มาตรฐานรวมถึงจำนวนมากของสิ่งที่ไม่ได้มาจาก STL และบางส่วนของพวกเขาจะไม่ได้แม่แบบเช่นและstd::localestd::thread

Libstdc ++ - v3 รวมโค้ดจำนวนมากจากSGI STL (การผสานขั้นสุดท้ายมาจากรีลีส 3.3 ) รหัสใน libstdc ++ มีการแก้ไขและการเปลี่ยนแปลงมากมายเมื่อเทียบกับรหัส SGI ดั้งเดิม

โดยเฉพาะอย่างยิ่งstringไม่ได้มาจาก SGI และไม่ใช้ชั้น "เชือก" ของพวกเขา (แม้ว่าจะรวมอยู่ในส่วนเสริมเพิ่มเติม) ไม่ใช่valarrayหรือบางส่วน คลาสvector<>นั้นมาจาก SGI แต่ได้รับการแก้ไขอย่างกว้างขวาง

ข้อมูลเพิ่มเติมเกี่ยวกับวิวัฒนาการของ libstdc ++ สามารถดูได้ที่วิวัฒนาการ APIและเอกสารประกอบที่เข้ากันได้

คำถามที่พบบ่อยสำหรับ STL SGI จะยังคงแนะนำการอ่าน


FYI ณ มีนาคม 2018 แม้ STL เว็บไซต์อย่างเป็นทางการwww.sgi.com/tech/stl/ จะหายไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.