ไลบรารีแม่แบบมาตรฐานของภาษาซีพลัสพลัส/priority queue

priority_queue เป็นโครงสร้างข้อมูลที่มาการเรียงลำดับข้อมูลตลอดเวลา
การใช้งานและการประกาศตัวแปร.
ต้องนำเข้า header file "queue" โดย <code>#include <queue></code>
การประกาศตัวแปรของ priority_queue มีได้หลากหลายรูปแบบ คือ
รายละเอียดเพิ่มเติม.
เนื่องจาก priority_queue จะทำการเรียงข้อมูลตลอดเวลา ดังนั้นจึงต้องมีเกณฑ์ในการเรียงหรือการเปรียบเทียบเกิดขึ้น เพราะ priority_queue ไม่อาจรู้ได้ว่าค่าไหนควรมาก่อนค่าไหน หากไม่มีการเปรียบเทียบเกิดขึ้น
สามารถแบ่งการประกาศ priority_queue ได้เป็น 2 รูปแบบ
หากการเรียงของ priority_queue เป็นการเรียงแบบน้อยไปมาก ข้อมูลด้านหน้าของ priority_queue จะมีค่าน้อยสุดไปเรื่อยๆ
จนถึงข้อมูลด้านปลายมีค่ามากสุด แต่ในการใช้ top หรือ pop จะเป็นการดำเนินการกับข้อมูล**ด้านปลาย**
เมื่อมีการเรียก top หรือ pop จึงเป็นการดำเนินการกับค่ามากที่สุด ฉะนั้นหากต้องการให้ top , pop ดำเนินการกับค่าอื่นๆแทน
ก็ต้องเปลี่ยนวิธีการเปรียบเทียบใหม่ (เช่นต้องการให้ top , pop ดำเนินการกับค่าน้อยสุด ก็ต้องเรียงจากมากไปน้อยแทน)
การใช้ compare class.
compare class คือ class/struct ที่สร้างขึ้นมาเพื่อบอกให้ priority_queue รู้ว่า ข้อมูลไหนควรมาก่อน ข้อมูลไหนควรมาหลัง (จะเรียงข้อมูลอย่างไรดี) โดยทั่วไปหากไม่กำหนด compare class ให้ priority_queue จะใช้ less เป็น compare class อัตโนมัติ (นั่นคือเรียงแบบน้อยไปมาก)
หลักการเขียน compare class.
กรณี a สำคัญเท่า b จะ return true หรือ false ก็ได้ เพราะถ้า a กับ b สำคัญพอๆกัน อะไรจะมาก่อนมันก็ไม่สำคัญ !
ตัวอย่าง compare class โดยเรียง int.
จากตัวอย่าง เราสร้าง struct/class ชื่อ cmpclass ภายในมีการ overloading operator  โดยรับค่า a และ b มา
กรณี a < b เราจะ return ค่า true ซึ่งก็คือการเรียงลำดับจากน้อยไปมากนั่นเอง
และในกรณีนี้ หากมีการเรียกใช้ pop , top ก็จะเป็นการดำเนินการกับค่าใน priority_queue ซึ่งมากที่สุด (เหมือนใช้ less)
หากต้องการให้ pop , top ดำเนินการกับค่าน้อยสุดก็คือต้องเปลี่ยนการเรียงเป็นมากไปน้อยแทน สามารถเขียนโค้ดได้ตามนี้

 เงี่ยนเลยเเหละ
การ Overloading Operator < ของ struct.
วิธีนี้ใช้ได้กับ datatype ที่เป็น struct เท่านั้น
แนวคิดวิธีนี้คือ เราสามารถกำหนดความหมายของ <math>«/math> ขึ้นมาเองให้กับ struct ใดๆได้ เช่น
ให้ struct มีจำนวนเต็ม aa กับ bb เป็นสมาชิก
เราสามารถกำหนดความหมายของ <math>«/math> ขึ้นมาเองให้ <math>a < b</math> return ค่า true เมื่อ a.aa <math»</math> b.aa
เพราะฉะนั้นหาก a.aa = 3 และ b.aa = 5
จะได้ว่า <math>b < a</math> return ค่า true (เพราะ b.aa <math»</math> a.aa)
แต่ <math>a < b</math> return ค่า false (เพราะ b.aa <math>\not></math> a.aa)
การเขียนโค้ด เราจะ overloading operator < โดยรับ T เข้ามา
จากนั้น เราจะเขียนเปรียบเทียบค่าของ T ที่เพิ่งรับเข้ามากับสมาชิกปัจจุบัน
จากโค้ดตัวอย่างเป็นการบอกว่า หาก aa ของตัวปัจจุบัน มีค่ามากกว่า aa ของ struct อีกตัวที่รับเข้ามา จะ return true
เพราะฉะนั้น เมื่อเรากำหนด <math>«/math> ให้ struct เรียบร้อยแล้ว เราก็ไม่จำเป็นจะต้องใช้ cmpclass อีก !
 "ดูเนื้อหาหลักที่ ภาษาซีพลัสพลัส/pass by reference"
การ pass by reference.
มีปัญหาอีกอย่างหนึ่งคือ ในกรณีที่ struct มีขนาดใหญ่มาก การส่งผ่าน struct แบบ pass by value บ่อยๆจะเสียเวลามาก
ดังนั้น สามารถแก้ไขปัญหาโดย pass by reference แทน หากนำโค้ดจากตัวอย่างที่แล้วมาแก้เพิ่มจะได้ดังนี้
กล่าวคือ เราจะเปลี่ยน <code>T val</code> ไปเป็น <code>const T& val</code> แทน
 #เปลี่ยนทาง stack
 #เปลี่ยนทาง queue
 #เปลี่ยนทาง priority_queue
 #เปลี่ยนทาง deque
 #เปลี่ยนทาง vector
 #เปลี่ยนทาง map
 #เปลี่ยนทาง set