คำตอบก่อนหน้านี้มีเพียงทางเลือกต้นไม้ที่อยู่และสีดำสีแดงอาจยังคงด้วยเหตุผลทางประวัติศาสตร์เท่านั้น
ทำไมไม่ตารางแฮช
ประเภทต้องการ<
ตัวดำเนินการ (การเปรียบเทียบ) เท่านั้นจึงจะใช้เป็นคีย์ในทรี อย่างไรก็ตามตารางแฮชต้องการให้แต่ละประเภทคีย์มีhash
ฟังก์ชันที่กำหนดไว้ การรักษาข้อกำหนดของประเภทให้น้อยที่สุดนั้นสำคัญมากสำหรับการเขียนโปรแกรมทั่วไปดังนั้นคุณสามารถใช้กับประเภทและอัลกอริทึมที่หลากหลายได้
การออกแบบตารางแฮชที่ดีนั้นต้องการความรู้ที่ลึกซึ้งเกี่ยวกับบริบทที่จะนำมาใช้ ควรใช้ที่อยู่แบบเปิดหรือเชื่อมโยงกับการเชื่อมโยง ควรยอมรับโหลดระดับใดก่อนปรับขนาด ควรใช้แฮชราคาแพงเพื่อหลีกเลี่ยงการชนหรืออย่างใดอย่างหนึ่งที่หยาบและเร็ว
เนื่องจาก STL ไม่สามารถคาดการณ์ได้ว่าเป็นตัวเลือกที่ดีที่สุดสำหรับแอปพลิเคชันของคุณค่าเริ่มต้นจึงต้องมีความยืดหยุ่นมากกว่า ต้นไม้ "ใช้งานได้" และขยายขนาดอย่างสวยงาม
(C ++ 11 เพิ่มตารางแฮชด้วยunordered_map
คุณสามารถดูได้จากเอกสารที่ต้องใช้นโยบายการตั้งค่าเพื่อกำหนดค่าตัวเลือกเหล่านี้จำนวนมาก)
ต้นไม้อื่น ๆ ล่ะ?
ต้นไม้สีแดงสีดำให้การค้นหาที่รวดเร็วและมีความสมดุลในตัวเองซึ่งแตกต่างจาก BSTs ผู้ใช้รายอื่นได้ชี้ให้เห็นข้อดีเหนือต้นไม้ AVL ที่ปรับสมดุลตนเอง
Alexander Stepanov (ผู้สร้าง STL) กล่าวว่าเขาจะใช้ต้นไม้ B * แทนต้นไม้สีแดงดำถ้าเขาเขียนstd::map
อีกครั้งเพราะเป็นมิตรกับแคชหน่วยความจำสมัยใหม่
หนึ่งในการเปลี่ยนแปลงที่ยิ่งใหญ่ที่สุดนับตั้งแต่นั้นมาก็คือการเติบโตของแคช การพลาดแคชนั้นมีค่าใช้จ่ายสูงมากดังนั้นการอ้างอิงในท้องที่จึงมีความสำคัญมากกว่าในตอนนี้ โครงสร้างข้อมูลที่ใช้โหนดซึ่งมีตำแหน่งอ้างอิงต่ำทำให้มีความรู้สึกน้อยลง ถ้าฉันออกแบบ STL วันนี้ฉันจะมีชุดของภาชนะที่แตกต่างกัน ตัวอย่างเช่น In-memory B * -tree เป็นตัวเลือกที่ดีกว่าต้นไม้สีแดงดำสำหรับการนำคอนเทนเนอร์ที่เชื่อมโยงไปใช้ - Alexander Stepanov
แผนที่ควรใช้ต้นไม้หรือไม่
การใช้งานแผนที่ที่เป็นไปได้อีกอย่างหนึ่งคือเวกเตอร์ที่เรียงลำดับแล้ว สิ่งนี้จะทำงานได้ดีสำหรับคอนเทนเนอร์ที่ไม่ได้แก้ไขบ่อยครั้ง แต่มีการสอบถามบ่อยครั้ง ฉันมักจะทำสิ่งนี้ใน C เป็นqsort
และbsearch
ถูกสร้างขึ้น
ฉันจำเป็นต้องใช้แผนที่ด้วยหรือไม่
ข้อควรพิจารณาเกี่ยวกับแคชหมายถึงไม่ค่อยมีเหตุผลที่จะใช้งานstd::list
หรือstd::deque
มากกว่าstd:vector
สำหรับสถานการณ์ที่เราสอนในโรงเรียน (เช่นการลบองค์ประกอบออกจากรายการกลาง) การใช้เหตุผลแบบเดียวกันนั้นการใช้การวนลูปกับการค้นหาเชิงเส้นรายการมักจะมีประสิทธิภาพและสะอาดกว่าการสร้างแผนที่สำหรับการค้นหาสองสามครั้ง
แน่นอนว่าการเลือกคอนเทนเนอร์ที่อ่านได้มักมีความสำคัญมากกว่าประสิทธิภาพ