อ่าน 5 นาที
ไลบรารีเทมเพลตมาตรฐาน
Standard Template Library ( STL ) เป็นไลบรารีซอฟต์แวร์ที่ออกแบบโดยAlexander Stepanovสำหรับ ภาษาการเขียนโปรแกรม C++ซึ่งมีอิทธิพลต่อหลายส่วนของC++ Standard...
ไลบรารีเทมเพลตมาตรฐาน
| ไลบรารีมาตรฐาน C++ |
|---|
| คอนเทนเนอร์ |
| ไลบรารีมาตรฐาน C |
| บทความนี้เป็นส่วนหนึ่งของชุดบทความเกี่ยวกับ ภาษาโปรแกรม C++ |
Standard Template Library ( STL ) เป็นไลบรารีซอฟต์แวร์ที่ออกแบบโดยAlexander Stepanovสำหรับ ภาษาการเขียนโปรแกรม C++ซึ่งมีอิทธิพลต่อหลายส่วนของC++ Standard Libraryแม้ว่าจะไม่ได้มีการบำรุงรักษาอย่างต่อเนื่องแล้ว และส่วนใหญ่ได้ถูกรวมเข้ากับ C++ Standard Library แล้ว STL ประกอบด้วยส่วนประกอบสี่อย่างได้แก่algorithms , containers , functorsและiterators [ 1 ]
STL (Static Language Toolbringers) เป็นไลบรารีที่จัดเตรียมคลาส ทั่วไป สำหรับภาษา C++ เช่น คอนเทนเนอร์และอาร์เรย์แบบเชื่อมโยงซึ่งสามารถใช้งานร่วมกับชนิดข้อมูลพื้นฐานหรือชนิดข้อมูลที่ผู้ใช้กำหนดเองได้ โดยต้องรองรับการดำเนินการพื้นฐานบางอย่าง (เช่น การคัดลอกและการกำหนดค่า) อัลกอริทึมของ STL นั้นเป็นอิสระจากคอนเทนเนอร์ ซึ่งช่วยลดความซับซ้อนของไลบรารีได้อย่างมาก
STL บรรลุผลลัพธ์ผ่านการใช้เทมเพลตแนวทางนี้ให้โพลีมอร์ฟิซึมในขั้นตอนการคอมไพล์ซึ่งมักมีประสิทธิภาพมากกว่าโพลีมอร์ฟิซึมแบบดั้งเดิมในขั้นตอนการรันไทม์ คอมไพเลอร์ C++ สมัยใหม่ได้รับการปรับแต่งเพื่อลดโทษของการสร้างนามธรรมที่เกิดจากการใช้งาน STL อย่างหนัก
STL ถูกสร้างขึ้นเป็นไลบรารีแรกของอัลกอริธึมทั่วไปและโครงสร้างข้อมูลสำหรับ C++ โดยคำนึงถึงแนวคิดสี่ประการ ได้แก่การเขียนโปรแกรมทั่วไปความเป็นนามธรรมโดยไม่สูญเสียประสิทธิภาพ โมเดลการคำนวณ ของVon Neumann [ 2 ]และความ หมายของค่า
STL และไลบรารีมาตรฐาน C++เป็นสองหน่วยงานที่แตกต่างกัน[ 3 ]แม้ว่าบางครั้งส่วนต่างๆ ของไลบรารีมาตรฐาน C++ ที่ได้รับอิทธิพล/สืบทอดมาจาก STL โดยตรงจะถูกเรียกว่า "STL" ก็ตาม[ 4 ]
ประวัติศาสตร์
ในเดือนพฤศจิกายน พ.ศ. 2536 Alexander Stepanovได้นำเสนอไลบรารีที่ใช้การเขียนโปรแกรมแบบเจเนริกให้กับ คณะกรรมการ มาตรฐาน C++ ของANSI/ISO การตอบรับของคณะกรรมการเป็นไปในทางที่ดีอย่างมาก และนำไปสู่คำขอจาก Andrew Koenigให้จัดทำข้อเสนออย่างเป็นทางการให้ทันการประชุมในเดือนมีนาคม พ.ศ. 2537 คณะกรรมการมีคำขอเปลี่ยนแปลงและเพิ่มเติมหลายประการ และสมาชิกคณะกรรมการได้พบกับ Stepanov และ Meng Lee เพื่อช่วยกันกำหนดรายละเอียด ข้อกำหนดสำหรับการเพิ่มเติมที่สำคัญที่สุด ( associative containers ) จะต้องแสดงให้เห็นว่ามีความสอดคล้องกันโดยการนำไปใช้งานอย่างสมบูรณ์ ซึ่งเป็นงานที่ Stepanov มอบหมายให้David Musser เป็นผู้ดำเนินการ ข้อเสนอดังกล่าวได้รับการอนุมัติขั้นสุดท้ายในการประชุมคณะกรรมการ ANSI/ISO เดือนกรกฎาคม พ.ศ. 2537 ต่อมา เอกสาร Stepanov และ Lee 17 ได้ถูกรวมเข้าไว้ในร่างมาตรฐาน C++ ของ ANSI/ISO (1, บางส่วนของข้อ 17 ถึง 27)
โอกาสในการเผยแพร่ STL อย่างกว้างขวางในช่วงแรกดีขึ้นอย่างมากเมื่อฮิวเลตต์-แพคการ์ดตัดสินใจเปิดให้ใช้งานการใช้งาน STL ได้ฟรีทางอินเทอร์เน็ตในเดือนสิงหาคม 1994 การใช้งานนี้ซึ่งพัฒนาโดยสเตปานอฟ ลี และมัสเซอร์ระหว่างกระบวนการกำหนดมาตรฐาน กลายเป็นพื้นฐานของการใช้งานมากมายที่ผู้จำหน่ายคอมไพเลอร์และไลบรารีนำเสนอในปัจจุบัน
องค์ประกอบ
คอนเทนเนอร์
STL ประกอบด้วยคอนเทนเนอร์ ลำดับ และคอนเทนเนอร์แบบเชื่อมโยง คอนเทนเนอร์เป็นวัตถุที่ใช้จัดเก็บข้อมูลคอนเทนเนอร์ ลำดับมาตรฐาน ได้แก่vector, deque, และส่วนคอนเทนเนอร์แบบเชื่อมโยงlistมาตรฐานได้แก่, , , , , และ นอกจาก นี้ยังมีอะแดปเตอร์คอนเทนเนอร์ , , และซึ่งเป็นคอนเทนเนอร์ที่มีอินเทอร์เฟซเฉพาะ โดยใช้คอนเทนเนอร์อื่นเป็นตัวดำเนินการ setmultisetmapmultimaphash_sethash_maphash_multisethash_multimapqueuepriority_queuestack
| คอนเทนเนอร์ | คำอธิบาย |
|---|---|
| ภาชนะธรรมดา | |
| คู่ | คอนเทนเนอร์แบบคู่ (pair container) เป็นคอนเทนเนอร์แบบเชื่อมโยงอย่างง่าย ประกอบด้วยทูเปิล 2 ตัวขององค์ประกอบข้อมูลหรือวัตถุ เรียกว่า 'แรก' และ 'ที่สอง' ตามลำดับที่กำหนดไว้ 'pair' ใน STL สามารถกำหนดค่า คัดลอก และเปรียบเทียบได้ อาร์เรย์ของวัตถุที่จัดสรรในแผนที่ (map) หรือแผนที่แฮช (hash_map) (อธิบายไว้ด้านล่าง) จะมีประเภทเป็น 'pair' โดยค่าเริ่มต้น ซึ่งองค์ประกอบ 'แรก' ทั้งหมดทำหน้าที่เป็นคีย์ที่ไม่ซ้ำกัน โดยแต่ละคีย์จะเชื่อมโยงกับวัตถุค่า 'ที่สอง' ของมัน |
| ลำดับ (อาร์เรย์/ รายการเชื่อมโยง ): ชุดข้อมูลที่มีการเรียงลำดับ | |
| เวกเตอร์ | อาร์เรย์แบบไดนามิกเช่น อาร์เรย์ ในภาษาซี (กล่าวคือ สามารถเข้าถึงข้อมูลแบบสุ่มได้ ) ที่มีความสามารถในการปรับขนาดตัวเองโดยอัตโนมัติเมื่อแทรกหรือลบข้อมูล การแทรกองค์ประกอบลงไปที่ท้ายเวกเตอร์ใช้เวลาเฉลี่ยคงที่การลบองค์ประกอบสุดท้ายใช้เวลาคงที่เท่านั้น เนื่องจากไม่มีการปรับขนาดเกิดขึ้น การแทรกและการลบที่ต้นหรือตรงกลางใช้เวลาเชิงเส้น มี การเพิ่มประสิทธิภาพสำหรับประเภทboolซึ่งสามารถเพิ่มประสิทธิภาพพื้นที่โดยการจัดกลุ่มค่า bool เข้าด้วยกัน[ 5 ] |
| รายการ | โครงสร้างข้อมูล แบบลิสต์เชื่อมโยงสองทิศทาง ( Doubly Linked List ) คือโครงสร้างที่จัดเก็บองค์ประกอบในหน่วยความจำแบบไม่ต่อเนื่อง ประสิทธิภาพการทำงานตรงข้ามกับเวกเตอร์ การค้นหาและการเข้าถึงข้อมูลช้า (ใช้เวลาเชิงเส้น) แต่เมื่อพบตำแหน่งที่ต้องการแล้ว การแทรกและการลบข้อมูลจะรวดเร็ว (ใช้เวลาคงที่) |
| สลิสต์ | รายการเชื่อมโยงเดี่ยว (Singly Linked List ) คือโครงสร้างข้อมูลที่ไม่ได้จัดเก็บองค์ประกอบไว้ในหน่วยความจำที่ต่อเนื่องกัน ประสิทธิภาพการทำงานตรงกันข้ามกับเวกเตอร์ การค้นหาและการเข้าถึงช้า (เวลาเชิงเส้น) แต่เมื่อพบตำแหน่งแล้ว การแทรกและการลบจะรวดเร็ว (เวลาคงที่) มีการแทรกและการลบที่มีประสิทธิภาพมากกว่าเล็กน้อย และใช้หน่วยความจำน้อยกว่ารายการเชื่อมโยงคู่ (Doubly Linked List) แต่สามารถวนซ้ำได้เฉพาะไปข้างหน้าเท่านั้น มีการใช้งานในไลบรารีมาตรฐานของ C++ ในชื่อ ` forward_liststdlib.stdlib` |
| เดค ( คิวสองด้าน ) | เวกเตอร์ที่มีการแทรก/ลบที่จุดเริ่มต้นหรือจุดสิ้นสุดโดยใช้เวลาคงที่โดยเฉลี่ยอย่างไรก็ตาม ขาดการรับประกันบางประการเกี่ยวกับความถูกต้องของตัววนซ้ำหลังจากแก้ไขเดคิว |
| อะแดปเตอร์คอนเทนเนอร์ | |
| คิว | จัดเตรียม อินเทอร์เฟ ซคิวFIFO ในแง่ของการดำเนินการ / / /pushpopfrontbackลำดับใดๆ ที่รองรับการดำเนินการ, , , และสามารถใช้เพื่อสร้างคิว (เช่นและ) ได้ |
| คิวลำดับความสำคัญ | มี อินเทอร์เฟ ซคิวลำดับความสำคัญในแง่ของการดำเนินการ (องค์ประกอบที่มีลำดับความสำคัญสูงสุดจะอยู่ด้านบนสุด) push/pop/topลำดับการเข้าถึงแบบสุ่มใดๆ ที่รองรับการดำเนินการ , , และสามารถใช้เพื่อสร้างอินสแตนซ์ของ priority_queue (เช่นและ) ได้ โดยจะถูกนำไปใช้โดยใช้ฮีป นอกจากนี้ องค์ประกอบควรสนับสนุนการเปรียบเทียบ (เพื่อพิจารณาว่าองค์ประกอบใดมีลำดับความสำคัญสูงกว่าและควรถูกลบออกก่อน) |
| ซ้อนกัน | มี อินเทอร์เฟซการจัดเรียง แบบLIFO ในแง่ของการทำงาน (องค์ประกอบที่ใส่เข้าไปล่าสุดจะอยู่ด้านบนสุด) push/pop/topลำดับใดๆ ที่รองรับการดำเนินการ, , และสามารถใช้เพื่อสร้างอินสแตนซ์ของสแต็กได้ (เช่น, , และ) |
| คอนเทนเนอร์แบบเชื่อมโยง : คอลเลกชันที่ไม่มีลำดับ | |
| ชุด | เซตทางคณิตศาสตร์การแทรก/ลบองค์ประกอบในเซตจะไม่ทำให้ตัวชี้ที่ชี้ไปยังเซตนั้นใช้การไม่ได้ มีฟังก์ชันการดำเนินการกับเซต ได้แก่ยูเนียนอินเตอร์เซกชันผลต่างผลต่างสมมาตรและการทดสอบการรวม ประเภทของข้อมูลต้องใช้ตัวดำเนินการเปรียบเทียบ<หรือต้องระบุฟังก์ชันเปรียบเทียบแบบกำหนดเอง ตัวดำเนินการเปรียบเทียบหรือฟังก์ชันเปรียบเทียบดังกล่าวต้องรับประกันลำดับแบบอ่อนที่เข้มงวดมิฉะนั้นพฤติกรรมจะไม่แน่นอน โดยทั่วไปจะใช้โครงสร้าง ข้อมูลแบบ ต้นไม้ ค้นหาไบนารีแบบปรับสมดุลตัวเอง |
| มัลติเซ็ต | เหมือนกับเซต แต่ยอมให้มีองค์ประกอบซ้ำกันได้ ( มัลติเซต ทางคณิตศาสตร์ ) |
| แผนที่ | อาร์เรย์แบบเชื่อมโยง (Associative array ) อนุญาตให้แมปข้อมูลจากรายการข้อมูลหนึ่ง (คีย์) ไปยังอีกรายการหนึ่ง (ค่า) ประเภทของคีย์ต้องใช้ตัวดำเนินการเปรียบเทียบ<หรือต้องระบุฟังก์ชันเปรียบเทียบแบบกำหนดเอง ตัวดำเนินการเปรียบเทียบหรือฟังก์ชันเปรียบเทียบดังกล่าวต้องรับประกันลำดับแบบอ่อนที่เข้มงวดมิฉะนั้นพฤติกรรมจะไม่แน่นอน โดยทั่วไปจะใช้โครงสร้างข้อมูลแบบต้นไม้ค้นหาไบนารีแบบปรับสมดุลเอง (self-balancing binary search tree) ในการใช้งาน |
| แผนที่หลายหน้า | เหมือนกับแผนที่ แต่สามารถใช้รหัสซ้ำได้ |
| ชุดแฮช ชุดแฮชหลายชุด แผนที่แฮ ชแผนที่หลายชุด | คล้ายกับ set, multiset, map หรือ multimap ตามลำดับ แต่ใช้ตารางแฮช ในการใช้ งาน คีย์ไม่ได้เรียงลำดับ แต่ ต้องมี ฟังก์ชันแฮชสำหรับประเภทคีย์นั้นๆ ประเภทเหล่านี้ไม่ได้รวมอยู่ในมาตรฐาน C++ คอนเทนเนอร์ที่คล้ายกันได้รับการกำหนดมาตรฐานในC++11แต่ใช้ชื่อที่แตกต่างกัน ( unordered_setและunordered_map) |
| ภาชนะประเภทอื่นๆ | |
| บิตเซ็ต | จัดเก็บลำดับของบิตคล้ายกับเวกเตอร์บูลีนขนาดคงที่ ใช้งานการดำเนินการระดับบิตและไม่มีตัววนซ้ำ ไม่ใช่ลำดับ สามารถเข้าถึงข้อมูลแบบสุ่มได้ |
| วาลาร์เรย์ | อาร์เรย์ชนิดข้อมูลอีกชนิดหนึ่ง มีจุดประสงค์เพื่อใช้ในเชิงตัวเลข (โดยเฉพาะอย่างยิ่งเพื่อแสดงเวกเตอร์และเมทริกซ์ ) มาตรฐาน C++ อนุญาตให้มีการปรับแต่งเฉพาะสำหรับวัตถุประสงค์นี้ ตามที่ Josuttis กล่าวvalarrayได้รับการออกแบบมาไม่ดี โดยบุคคล "ที่ออกจากคณะกรรมการ [มาตรฐาน C++] ไปนานก่อนที่มาตรฐานจะเสร็จสมบูรณ์" และควรเลือกใช้ไลบรารีเทมเพลตนิพจน์ แทน [ 6 ]การเขียนใหม่ของ ส่วน valarrayในมาตรฐานในลักษณะนี้ถูกปฏิเสธ และกลายเป็นการอนุญาตให้ใช้งานโดยใช้เทมเพลตนิพจน์แทน[ 7 ] |
ตัววนซ้ำ
STL มีการใช้งานตัววนซ้ำ (iterator ) อยู่ 5 ประเภท ได้แก่ตัววนซ้ำแบบรับค่าเข้า (ซึ่งใช้ได้เฉพาะในการอ่านลำดับของค่า), ตัววนซ้ำแบบส่งค่าออก (ซึ่งใช้ได้เฉพาะในการเขียนลำดับของค่า), ตัววนซ้ำแบบไปข้างหน้า (ซึ่งสามารถอ่าน เขียน และเคลื่อนที่ไปข้างหน้าได้), ตัววนซ้ำแบบสองทิศทาง (ซึ่งคล้ายกับตัววนซ้ำแบบไปข้างหน้า แต่สามารถเคลื่อนที่ไปข้างหลังได้ด้วย) และตัววนซ้ำแบบเข้าถึงแบบสุ่ม (ที่สามารถเคลื่อนที่ได้อย่างอิสระหลายขั้นตอนในการดำเนินการครั้งเดียว)
แนวคิดพื้นฐานของ STL คือช่วง (range)ซึ่งเป็นคู่ของตัววนซ้ำ (iterator) ที่กำหนดจุดเริ่มต้นและจุดสิ้นสุดของการคำนวณ และเทมเพลตอัลกอริธึมส่วนใหญ่ของไลบรารีที่ทำงานกับโครงสร้างข้อมูลจะมีอินเทอร์เฟซที่ใช้ช่วง[ 8 ]
เป็นไปได้ที่จะใช้ตัววนซ้ำแบบสองทิศทางเหมือนตัววนซ้ำแบบเข้าถึงแบบสุ่ม ดังนั้นการเลื่อนไปข้างหน้าสิบขั้นจึงทำได้โดยการเลื่อนไปข้างหน้าทีละขั้น รวมทั้งหมดสิบครั้ง อย่างไรก็ตาม การมีตัววนซ้ำแบบเข้าถึงแบบสุ่มที่แตกต่างกันจะให้ข้อได้เปรียบด้านประสิทธิภาพ ตัวอย่างเช่น เวกเตอร์จะมีตัววนซ้ำแบบเข้าถึงแบบสุ่ม แต่ลิสต์จะมีเพียงตัววนซ้ำแบบสองทิศทางเท่านั้น
ตัววนซ้ำ (Iterator) เป็นคุณลักษณะหลักที่ทำให้ STL มีความยืดหยุ่นสูง ตัวอย่างเช่น อัลกอริทึมในการย้อนกลับลำดับสามารถนำไปใช้ได้โดยใช้ตัววนซ้ำแบบสองทิศทาง จากนั้นสามารถนำการใช้งานแบบเดียวกันนี้ไปใช้กับลิสต์ เวกเตอร์ และเดคิวได้คอนเทนเนอร์ที่ผู้ใช้สร้างขึ้นจะต้องมีตัววนซ้ำที่ใช้งานอินเทอร์เฟซตัววนซ้ำมาตรฐานหนึ่งในห้าแบบเท่านั้น และอัลกอริทึมทั้งหมดที่มีอยู่ใน STL ก็สามารถนำไปใช้กับคอนเทนเนอร์นั้นได้
ความทั่วไปนี้บางครั้งก็มีข้อเสียเช่นกัน ตัวอย่างเช่น การค้นหาในคอนเทนเนอร์แบบเชื่อมโยงเช่น แผนที่หรือเซต อาจช้ากว่ามากหากใช้ตัววนซ้ำ (iterator) เมื่อเทียบกับการเรียกใช้ฟังก์ชันสมาชิกที่คอนเทนเนอร์นั้นมีให้เอง ทั้งนี้เพราะเมธอดของคอนเทนเนอร์แบบเชื่อมโยงสามารถใช้ประโยชน์จากความรู้เกี่ยวกับโครงสร้างภายใน ซึ่งเป็นสิ่งที่อัลกอริธึมที่ใช้ตัววนซ้ำไม่สามารถเข้าถึงได้
อัลกอริทึม
STL มีอัลกอริธึมจำนวนมากที่ใช้ในการดำเนินการต่างๆ เช่น การค้นหาและการเรียงลำดับ โดยแต่ละอัลกอริธึมจะต้องใช้ตัววนซ้ำ (iterator) ในระดับหนึ่ง (ดังนั้นจึงสามารถใช้งานได้กับคอนเทนเนอร์ใดๆ ที่มีอินเทอร์เฟซสำหรับตัววนซ้ำ) อัลกอริธึมการค้นหา เช่น `search` binary_searchและ `sort` lower_boundใช้การค้นหาแบบไบนารีและอัลกอริธึมการเรียงลำดับ เช่น `search` ต้องการให้ชนิดของข้อมูลต้องใช้ตัวดำเนินการเปรียบเทียบ<หรือต้องระบุฟังก์ชันเปรียบเทียบแบบกำหนดเอง โดยตัวดำเนินการเปรียบเทียบหรือฟังก์ชันเปรียบเทียบดังกล่าวต้องรับประกันลำดับแบบอ่อนที่เข้มงวดนอกจากนี้ ยังมีอัลกอริธึมสำหรับการสร้างฮีปจากช่วงขององค์ประกอบ การสร้างการเรียงสับเปลี่ยนตามลำดับตัวอักษรของช่วงขององค์ประกอบ การรวมช่วงที่เรียงลำดับแล้ว และการดำเนินการยูเนียนอินเตอร์เซกชันและ ดิฟเฟอ เรนเชียลของช่วงที่เรียงลำดับแล้ว
ฟังก์ชัน
STL ประกอบด้วยคลาสที่โอเวอร์โหลดตัวดำเนินการเรียกฟังก์ชัน ( ) อินสแตนซ์ของคลาสดังกล่าวเรียกว่า ฟันคเตอร์ หรืออ็อบเจ็กต์ฟังก์ชัน ฟันคเตอร์อนุญาตให้กำหนดพารามิเตอร์พฤติกรรมของฟังก์ชันที่เกี่ยวข้องได้ (เช่น ผ่านอาร์กิวเมนต์ที่ส่งไปยังคอนสตรัคเตอร์ ของฟันคเตอร์ ) และสามารถใช้เพื่อเก็บข้อมูลสถานะต่อฟันคเตอร์ที่เกี่ยวข้องไว้กับฟังก์ชันได้ เนื่องจากทั้งฟันคเตอร์และพอยเตอร์ฟังก์ชันสามารถเรียกใช้ได้โดยใช้ไวยากรณ์ของการเรียกฟังก์ชัน จึงสามารถใช้แทนกันได้เป็นอาร์กิวเมนต์สำหรับเทมเพลตเมื่อพารามิเตอร์ที่เกี่ยวข้องปรากฏเฉพาะในบริบทการเรียกฟังก์ชันเท่านั้น operator()
ฟังก์ชันชนิดหนึ่งที่พบได้บ่อยคือฟังก์ชันเงื่อนไข (predicate ) ตัวอย่างเช่น อัลกอริทึม ต่างๆ เช่น find_if`sort` ใช้ ฟังก์ชันเงื่อนไขเอก ภาค (unary predicate) ที่ทำงานกับองค์ประกอบของลำดับ อัลกอริทึมต่างๆ เช่น `sort`, `partial_sort`, `nth_element` และคอนเทนเนอร์ ที่เรียงลำดับทั้งหมด ใช้ฟังก์ชันเงื่อนไข ทวิภาค (binary predicate) ที่ต้องให้ลำดับอ่อนที่เข้มงวด (strict weak ordering ) กล่าวคือ ต้องมีพฤติกรรมเหมือน การทดสอบ การเป็นสมาชิก ใน ความสัมพันธ์ทวิภาคแบบถ่ายทอด (transitive) ไม่สะท้อน (non-reflexive) และไม่สมมาตร (asymmetric ) หากไม่มีการระบุฟังก์ชันเงื่อนไขใดๆ อัลกอริทึมและคอนเทนเนอร์เหล่านี้จะใช้`less`เป็นค่าเริ่มต้น ซึ่งจะเรียกใช้ตัวดำเนินการน้อยกว่า (<)
คำวิจารณ์
คุณภาพการใช้งาน (Quality of Implementation หรือ QoI) ของคอมไพเลอร์ C++ มีผลกระทบอย่างมากต่อความสามารถในการใช้งานของ STL (และโค้ดเทมเพลตโดยทั่วไป):
- ข้อความแสดงข้อผิดพลาดที่เกี่ยวข้องกับเทมเพลตมักจะยาวมากและยากต่อการถอดรหัส ปัญหานี้ถือว่าร้ายแรงมากจนมีการพัฒนาเครื่องมือหลายอย่างขึ้นมาเพื่อลดความซับซ้อนและจัดรูปแบบข้อความแสดงข้อผิดพลาดที่เกี่ยวข้องกับ STL ให้เข้าใจง่ายขึ้น
- การใช้เทมเพลตอย่างไม่ระมัดระวังอาจทำให้โค้ดบวมได้ [ 9 ] ปัญหานี้ได้รับการแก้ไขด้วยเทคนิคพิเศษภายในการใช้งาน STL (เช่น การใช้คอนเทนเนอร์ void* ภายในและเทคนิค "เทมเพลตลดน้ำหนัก" อื่นๆ) และการปรับปรุงเทคนิคการเพิ่มประสิทธิภาพของคอมไพเลอร์ อย่างไรก็ตาม อาการนี้คล้ายกับการคัดลอกชุดฟังก์ชันด้วยตนเองอย่างไม่รอบคอบเพื่อทำงานกับประเภทที่แตกต่างกัน ซึ่งทั้งสองอย่างสามารถหลีกเลี่ยงได้ด้วยความระมัดระวังและเทคนิคที่ดี
- การสร้างอินสแตนซ์ของเทมเพลตอาจเพิ่มเวลาในการคอมไพล์และการใช้หน่วยความจำ โดยแลกกับการลดการตัดสินใจในขณะรันไทม์ (เช่น ผ่านฟังก์ชันเสมือน) จนกว่าเทคโนโลยีคอมไพเลอร์จะพัฒนาขึ้นมากพอ ปัญหานี้สามารถแก้ไขได้เพียงบางส่วนเท่านั้น โดยการเขียนโค้ดอย่างระมัดระวัง หลีกเลี่ยงรูปแบบการเขียนโค้ดบางอย่าง และไม่ใช้เทมเพลตในกรณีที่ไม่เหมาะสม หรือในกรณีที่ให้ความสำคัญกับประสิทธิภาพในขณะคอมไพล์
ประเด็นอื่นๆ ได้แก่:
- การเริ่มต้นใช้งาน คอนเทนเนอร์ STL ด้วยค่าคงที่ภายในซอร์สโค้ดนั้นไม่ง่ายเหมือนกับโครงสร้างข้อมูลที่สืบทอดมาจากภาษา C (ซึ่งได้รับการแก้ไขในC++11ด้วยลิสต์ตัวเริ่มต้น )
- คอนเทนเนอร์ STL ไม่ได้มีจุดประสงค์เพื่อใช้เป็นคลาสพื้นฐาน (ตัวทำลายของคอนเทนเนอร์นั้นตั้งใจให้เป็นแบบไม่เสมือน) การสืบทอดจากคอนเทนเนอร์เป็นความผิดพลาดที่พบบ่อย[ 10 ] [ 11 ]
- แนวคิดของตัววนซ้ำตามที่ STL นำมาใช้อาจเข้าใจยากในตอนแรก ตัวอย่างเช่น หากค่าที่ตัววนซ้ำชี้ไปถูกลบ ตัววนซ้ำนั้นก็จะไม่ถูกต้องอีกต่อไป นี่เป็นสาเหตุทั่วไปของข้อผิดพลาด การใช้งาน STL ส่วนใหญ่มีโหมดดีบักซึ่งช้ากว่า แต่สามารถระบุตำแหน่งข้อผิดพลาดดังกล่าวได้หากใช้งาน ปัญหาที่คล้ายกันนี้มีอยู่ในภาษาอื่นๆ เช่นJavaมีการ เสนอให้ใช้ ช่วงเป็นทางเลือกที่ปลอดภัยและยืดหยุ่นกว่าตัววนซ้ำ[ 12 ]
- รูปแบบการวนซ้ำบางอย่าง เช่น API การแจงนับการเรียกกลับ ไม่สามารถทำให้เข้ากับโมเดล STL ได้หากไม่ใช้coroutines [ 13 ]ซึ่งอยู่นอกมาตรฐาน C++ จนกระทั่ง C++20
- การปฏิบัติตามมาตรฐานคอมไพเลอร์ไม่ได้เป็นการรับประกันว่า อ็อบเจ็กต์ Allocatorซึ่งใช้สำหรับการจัดการหน่วยความจำสำหรับคอนเทนเนอร์จะทำงานร่วมกับพฤติกรรมที่ขึ้นอยู่กับสถานะได้ ตัวอย่างเช่น ไลบรารีแบบพกพาไม่สามารถกำหนดประเภท Allocator ที่จะดึงหน่วยความจำจากพูลต่างๆ โดยใช้อ็อบเจ็กต์ Allocator ที่แตกต่างกันของประเภทนั้นได้ (Meyers, หน้า 50) (แก้ไขในC++11 )
- ชุดอัลกอริธึมไม่สมบูรณ์ ตัวอย่างเช่น
copy_ifอัลกอริธึมถูกละเว้น[ 14 ]แม้ว่าจะถูกเพิ่มในC++11 แล้วก็ตาม[ 15 ]
การนำไปใช้
- การพัฒนา STL ดั้งเดิมโดย Stepanov และ Lee ในปี 1994 โดยHewlett-Packardปัจจุบันไม่มีการบำรุงรักษาแล้ว
- SGI STL พัฒนาต่อยอดจากเวอร์ชันดั้งเดิมโดย Stepanov & Lee ในปี 1997 โดยSilicon Graphicsปัจจุบันไม่มีการบำรุงรักษาแล้ว
- STLPortสร้างขึ้นบนพื้นฐานของ SGI STL
- ไลบรารีมาตรฐาน Rogue Wave (HP, SGI, SunSoft , Siemens-Nixdorf )
- ไลบรารีมาตรฐาน Apache C++ (จุดเริ่มต้นของไลบรารีนี้คือไลบรารีมาตรฐาน Rogue Wave เวอร์ชันปี 2005 [ 16 ] )
- Libstdc++ใช้โค้ดที่ได้มาจาก SGI STL สำหรับอัลกอริธึมและคอนเทนเนอร์ที่กำหนดไว้ในC++ 03
- SGI STL พัฒนาต่อยอดจากเวอร์ชันดั้งเดิมโดย Stepanov & Lee ในปี 1997 โดยSilicon Graphicsปัจจุบันไม่มีการบำรุงรักษาแล้ว
- ไลบรารี Dinkum STL โดยPJ Plauger
ดูเพิ่มเติม
หมายเหตุ
- ↑โฮลซ์เนอร์, สตีเวน (2001) C++ : สมุดสีดำ . สกอตส์เดล, อริโซนา: กลุ่ม Coriolis พี 648. ไอเอสบีเอ็น 1-57610-777-9
STL ประกอบด้วย
คอนเทนเนอร์
ตัว วน
ซ้ำ อ็อบเจ็กต์
ฟังก์ชัน
และ
อั
ลกอริธึ
ม - ^ Musser, David (2001). คู่มือการสอนและอ้างอิง STL: การ เขียนโปรแกรม C++ ด้วยไลบรารีเทมเพลตมาตรฐานAddison Wesley ISBN 0-201-37923-6.
- ^การแข่งขันความเบาในวงโคจร (5 มีนาคม 2011) "ความแตกต่างระหว่าง "STL" และ "ไลบรารีมาตรฐาน C++" คืออะไร?" Stack Overflow สืบค้นเมื่อ 21 ตุลาคม 2021
- ^คณะกรรมการมาตรฐาน C++ (2021). P2412R0 - การปรับปรุงเพิ่มเติมในการออกแบบโมดูล C++สืบค้นเมื่อจาก https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2412r0.pdf เก็บถาวรเมื่อวันที่ 20 พฤศจิกายน 2024 (วันที่ไม่ตรงกัน)ที่ Wayback Machine
- ^ "[vector.bool]" . Eelis . สืบค้นเมื่อ22 ธันวาคม 2024 .
- ^ Josuttis, Nicolai M. (1999). The C++ Standard Library: A Tutorial and Handbook . Addison - Wesley Professional. หน้า 547. ISBN 9780201379266.
- ↑วันเดวอร์เดอ, เดวิด; โจสุตติส, นิโคไล เอ็ม. (2002). เทมเพลต C++: คู่มือฉบับสมบูรณ์แอดดิสัน เวสลีย์ . ไอเอสบีเอ็น 0-201-73484-2.
- ^ Stepanov, Alexander; Lee, Meng (31 ตุลาคม 1995). "ไลบรารีเทมเพลตมาตรฐาน" (PDF) . สืบค้นเมื่อ16 ธันวาคม 2018 .
เทมเพลตอัลกอริทึมส่วนใหญ่ของไลบรารีที่ทำงานกับโครงสร้างข้อมูลมีอินเทอร์เฟซที่ใช้ช่วง ช่วงคือคู่ของตัววนซ้ำที่กำหนดจุดเริ่มต้นและจุดสิ้นสุดของการคำนวณ [...] โดยทั่วไป ช่วง [i, j) หมายถึงองค์ประกอบในโครงสร้างข้อมูลโดยเริ่มจากองค์ประกอบที่ชี้โดย i และไปจนถึงแต่ไม่รวมองค์ประกอบที่ชี้โดย j ช่วง [i, j) จะถูกต้องก็ต่อเมื่อสามารถเข้าถึง j จาก i ได้
- ^เอเดรียน สโตน. "การลดขนาดโค้ดที่ใหญ่เกินไป: การใช้เทมเพลตเฉพาะทางมากเกินไป "
- ^ Meyers, Scott (2005). Effective C++ ฉบับที่สาม – 55 วิธีเฉพาะเพื่อปรับปรุงการออกแบบของคุณAddison Wesley ISBN 0-321-33487-6.
- ^ Sutter, Herb ; Alexandrescu, Andrei (2004). มาตรฐานการเขียนโค้ด C++: 101 กฎ แนวทาง และแนวปฏิบัติที่ดีที่สุด Addison-Wesley. ISBN 0-321-11358-6.
- ^ Andrei Alexandrescu (6 พฤษภาคม 2009). "Iterators Must Go" (PDF) . BoostCon 2009. สืบค้นเมื่อ19 มีนาคม 2011 .
- ^ Matthew Wilson (กุมภาพันธ์ 2547). "API การแจงนับแบบ Callback และแนวคิดตัววนซ้ำอินพุต" . วารสารของดร. ด็อบบ์ .
- ^ Bjarne Stroustrup (2000). ภาษาการเขียนโปรแกรม C++ (ฉบับที่ 3). Addison-Wesley. ISBN 0-201-70073-5.หน้า 530
- ^อัลกอริทึม STL เพิ่มเติม (ฉบับปรับปรุง 2)
- ^ "ไลบรารีมาตรฐาน Apache C++" . stdcxx.apache.org . สืบค้นเมื่อ1 มีนาคม 2023 .
ลิงก์ภายนอก
- เอกสารอ้างอิง C++
- เอกสารอ้างอิง C++ STLรวมถึงคุณสมบัติของ C++11
- คู่มือโปรแกรมเมอร์ STLจากSGIเดิมอยู่ที่[1] (เนื้อหาที่เลิกใช้แล้ว)
- เอกสารอ้างอิงคลาสไลบรารีมาตรฐาน C++ ของ Apache (เดิมชื่อ Rogue Wave)
- คู่มือผู้ใช้ไลบรารีมาตรฐาน C++ ของ Apache (เดิมชื่อ Rogue Wave)
- Bjarne Stroustrup กล่าวถึงการกำเนิดของ STL (หน้า 5 ส่วนที่ 3.1)
- ข้อกำหนดมาตรฐาน C++
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ไลบรารีเทมเพลตมาตรฐาน
Standard Template Library ( STL ) เป็นไลบรารีซอฟต์แวร์ที่ออกแบบโดยAlexander Stepanovสำหรับ ภาษาการเขียนโปรแกรม C++ซึ่งมีอิทธิพลต่อหลายส่วนของC++ Standard...
ประวัติศาสตร์
ในเดือนพฤศจิกายน พ.ศ. 2536 Alexander Stepanov ได้นำเสนอไลบรารีที่ใช้การเขียนโปรแกรมแบบเจเนริกให้กับ คณะกรรมการ มาตรฐาน C++ ของ ANSI/ISO การตอบรับของคณะกรรมการเป็นไปในทางที่ดีอย่างมาก และนำไปสู่คำขอจาก Andrew Koenig...
คอนเทนเนอร์
STL ประกอบด้วย คอนเทนเนอร์ ลำดับ และคอนเทนเนอร์แบบเชื่อมโยง คอนเทนเนอร์เป็นวัตถุที่ใช้จัดเก็บข้อมูล คอนเทนเนอร์ ลำดับมาตรฐาน ได้แก่ vector , deque , และ ส่วนคอนเทนเนอร์แบบเชื่อมโยง list มาตรฐานได้แก่, , , , , และ นอกจาก นี้ยังมี อะแดปเตอร์คอนเทนเนอร์ , ,...
ตัววนซ้ำ
STL มีการใช้งาน ตัววนซ้ำ (iterator ) อยู่ 5 ประเภท ได้แก่ ตัววนซ้ำแบบรับค่าเข้า (ซึ่งใช้ได้เฉพาะในการอ่านลำดับของค่า), ตัววนซ้ำแบบส่งค่าออก (ซึ่งใช้ได้เฉพาะในการเขียนลำดับของค่า), ตัววนซ้ำแบบไปข้างหน้า (ซึ่งสามารถอ่าน เขียน และเคลื่อนที่ไปข้างหน้าได้),...