Forward_list ใน STL คืออะไร?
Forward list เป็นคอนเทนเนอร์แบบลำดับที่อนุญาตให้แทรกและลบข้อมูลได้ในเวลาคงที่ (constant time) ทุกตำแหน่งภายในลำดับ Forward list ถูกนำมาใช้งานเป็น singly-linked list (รายการเชื่อมโยงเดี่ยว) การจัดลำดับถูกเก็บรักษาโดยการเชื่อมโยงแต่ละองค์ประกอบไปยังองค์ประกอบถัดไปในลำดับ
forward_list::merge() คืออะไร?
forward_list::merge() เป็นฟังก์ชันในตัวใน C++ STL ที่ใช้สำหรับ รวมสอง forward_list ที่เรียงลำดับแล้ว ให้กลายเป็น forward_list เดียวที่เรียงลำดับ
เงื่อนไขสำคัญ: ก่อนการรวม (merge) ทั้งสองลิสต์ ต้องได้รับการเรียงลำดับแล้ว หากไม่ได้เรียงลำดับ ผลลัพธ์จะไม่ถูกต้อง
ไวยากรณ์ (Syntax)
flist_container1.merge(flist_container2); // รวมทั้งสองลิสต์ flist_container1.merge(flist_container2, comparator); // รวมพร้อม comparator แบบกำหนดเอง
พารามิเตอร์ (Parameters)
- list_container2 - ออบเจ็กต์ของลิสต์ที่สองซึ่งจะถูกรวมเข้าไป
- comparator - นิยามการเปรียบเทียบภายใน (binary predicate) รับค่าสองค่าที่มีชนิดเหมือนกับที่กำหนดในลิสต์ ส่งคืน
trueหากองค์ประกอบของ list_container1 ควรอยู่ก่อน list_container2 มิฉะนั้นส่งคืนfalse
ค่าที่ส่งคืน (Return Value)
ฟังก์ชันนี้ไม่ส่งคืนค่า (void) ลิสต์ที่สอง (flist_container2) จะว่างเปล่าหลังการรวม
ตัวอย่าง: รวมสองลิสต์ที่เรียงลำดับแล้ว
#include <forward_list>
#include <iostream>
using namespace std;
int main() {
// สร้าง forward list โดยแทรกค่าที่เรียงลำดับแล้ว
forward_list<int> myForwardList1 = {1, 3, 5, 7};
forward_list<int> myForwardList2 = {2, 4, 6};
// รวมสอง forward list ที่เรียงลำดับแล้ว
myForwardList1.merge(myForwardList2);
cout << "องค์ประกอบหลังรวม (merge)" << endl;
for (auto i = myForwardList1.begin(); i != myForwardList1.end(); ++i)
cout << *i << " ";
return 0;
}
ผลลัพธ์ (Output)
องค์ประกอบหลังรวม (merge) 1 2 3 4 5 6 7
ตัวอย่าง: ใช้งานร่วมกับ Comparator (ลำดับจากมากไปน้อย)
ในตัวอย่างนี้ เราสร้างลิสต์ที่ยังไม่เรียงลำดับ เรียงลำดับก่อนด้วย sort() แล้วค่อยรวม
#include <forward_list>
#include <iostream>
#include <algorithm> // สำหรับ sort
using namespace std;
int main() {
// สร้าง forward list ที่ยังไม่เรียงลำดับ
forward_list<int> myForwardList1 = {3, 2, 9};
forward_list<int> myForwardList2 = {8, 1, 2};
// เรียงลำดับ forward list โดยใช้ sort()
myForwardList1.sort();
myForwardList2.sort();
// รวม (จะเรียงจากน้อยไปมากตามค่าเริ่มต้น)
myForwardList1.merge(myForwardList2);
cout << "องค์ประกอบหลังรวม" << endl;
for (auto i = myForwardList1.begin(); i != myForwardList1.end(); ++i)
cout << *i << " ";
return 0;
}
ผลลัพธ์ (Output)
องค์ประกอบหลังรวม 1 2 2 3 8 9
หมายเหตุ: บทความต้นฉบับมีส่วนหัว "With comparator" แต่โค้ดตัวอย่างไม่ได้ใช้ comparator แบบกำหนดเอง (ใช้แค่ sort() แล้ว merge() แบบปกติ) หากต้องการเรียงจากมากไปน้อย ให้ใช้ myForwardList1.merge(myForwardList2, greater<int>()); หลังเรียงลำดับจากมากไปน้อยก่อน