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

priority_queue เป็นโครงสร้างข้อมูลที่มาการเรียงลำดับข้อมูลตลอดเวลา
การใช้งานและการประกาศตัวแปร
การใช้งานและการประกาศตัวแปร.
ต้องนำเข้า header file "queue" โดย codice_1
การประกาศตัวแปรของ priority_queue มีได้หลากหลายรูปแบบ คือ

ให้ codice_2 คือ datatype ใดๆ และ codice_3 คือชื่อตัวแปร มีรูปแบบการประกาศตัวแปร priority_queue โดย codice_4
หากต้องการเขียน compare class เองก็จะใช้รูปแบบ codice_5 รายละเอียด compare class อ่านที่นี่
method
push
pop
top
size
empty
รายละเอียดเพิ่มเติม

รายละเอียดเพิ่มเติม.
สามารถแบ่งการประกาศ priority_queue ได้เป็น 2 รูปแบบ

ระบุ compare class จะเหมือนตัวอย่างที่ 2 ในหัวข้อการประกาศตัวแปร ในกรณีนี้ priority_queue จะดูว่าเกณฑ์การเปรียบเทียบค่าเป็นอย่างไรตาม compare class
ไม่ระบุ compare class จะเหมือนตัวอย่างที่ 1 ในหัวข้อการประกาศตัวแปร ในกรณีนี้ priority_queue จะใช้ less เป็น compare class โดยอัตโนมัติ

หาก datatype ที่ระบุเป็น ชนิดตัวแปรพื้นฐาน จะเป็นการเรียงแบบน้อยไปมาก
หาก datatype ที่ระบุเป็น std::string จะเป็นการเรียงแบบ lexicographic order
หาก datatype ที่ระบุเป็น struct ที่มีการ overloading operator 
หาก datatype ที่ระบุเป็น datatype อื่นๆซึ่ง less ไม่รู้จัก จะเกิด compilation error ขึ้น


จนถึงข้อมูลด้านปลายมีค่ามากสุด แต่ในการใช้ top หรือ pop จะเป็นการดำเนินการกับข้อมูล**ด้านปลาย**
เมื่อมีการเรียก top หรือ pop จึงเป็นการดำเนินการกับค่ามากที่สุด ฉะนั้นหากต้องการให้ top , pop ดำเนินการกับค่าอื่นๆแทน
ก็ต้องเปลี่ยนวิธีการเปรียบเทียบใหม่ (เช่นต้องการให้ top , pop ดำเนินการกับค่าน้อยสุด ก็ต้องเรียงจากมากไปน้อยแทน)
การใช้ compare class
การใช้ compare class.
compare class คือ class/struct ที่สร้างขึ้นมาเพื่อบอกให้ priority_queue รู้ว่า ข้อมูลไหนควรมาก่อน ข้อมูลไหนควรมาหลัง (จะเรียงข้อมูลอย่างไรดี) โดยทั่วไปหากไม่กำหนด compare class ให้ priority_queue จะใช้ less เป็น compare class อัตโนมัติ (นั่นคือเรียงแบบน้อยไปมาก)
หลักการเขียน compare class

หากต้องการให้ a มาก่อน b ให้ return true
หากต้องการให้ b มาก่อน a ให้ return false

ตัวอย่าง compare class โดยเรียง int
ตัวอย่าง compare class โดยเรียง int.
จากตัวอย่าง เราสร้าง struct/class ชื่อ cmpclass ภายในมีการ overloading operator  โดยรับค่า a และ b มา
กรณี a < b เราจะ return ค่า true ซึ่งก็คือการเรียงลำดับจากน้อยไปมากนั่นเอง
และในกรณีนี้ หากมีการเรียกใช้ pop , top ก็จะเป็นการดำเนินการกับค่าใน priority_queue ซึ่งมากที่สุด (เหมือนใช้ less)
หากต้องการให้ pop , top ดำเนินการกับค่าน้อยสุดก็คือต้องเปลี่ยนการเรียงเป็นมากไปน้อยแทน สามารถเขียนโค้ดได้ตามนี้


 เงี่ยนเลยเเหละ
การ Overloading Operator 
การ Overloading Operator < ของ struct.
วิธีนี้ใช้ได้กับ datatype ที่เป็น struct เท่านั้น
แนวคิดวิธีนี้คือ เราสามารถกำหนดความหมายของ formula_1 ขึ้นมาเองให้กับ struct ใดๆได้ เช่น
ให้ struct มีจำนวนเต็ม aa กับ bb เป็นสมาชิก
เราสามารถกำหนดความหมายของ formula_1 ขึ้นมาเองให้ formula_3 return ค่า true เมื่อ a.aa formula_4 b.aa
เพราะฉะนั้นหาก a.aa = 3 และ b.aa = 5
จะได้ว่า formula_5 return ค่า true (เพราะ b.aa formula_4 a.aa)
แต่ formula_3 return ค่า false (เพราะ b.aa formula_8 a.aa)
การเขียนโค้ด เราจะ overloading operator < โดยรับ T เข้ามา
จากนั้น เราจะเขียนเปรียบเทียบค่าของ T ที่เพิ่งรับเข้ามากับสมาชิกปัจจุบัน
จากโค้ดตัวอย่างเป็นการบอกว่า หาก aa ของตัวปัจจุบัน มีค่ามากกว่า aa ของ struct อีกตัวที่รับเข้ามา จะ return true
เพราะฉะนั้น เมื่อเรากำหนด formula_1 ให้ struct เรียบร้อยแล้ว เราก็ไม่จำเป็นจะต้องใช้ cmpclass อีก !
การ pass by reference
การ pass by reference.
มีปัญหาอีกอย่างหนึ่งคือ ในกรณีที่ struct มีขนาดใหญ่มาก การส่งผ่าน struct แบบ pass by value บ่อยๆจะเสียเวลามาก
ดังนั้น สามารถแก้ไขปัญหาโดย pass by reference แทน หากนำโค้ดจากตัวอย่างที่แล้วมาแก้เพิ่มจะได้ดังนี้
กล่าวคือ เราจะเปลี่ยน codice_6 ไปเป็น codice_7 แทน
ตัวอย่างโค้ด
สารบัญ