Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ฟังก์ชัน merge() ของ forward_list ใน C++ STL

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>()); หลังเรียงลำดับจากมากไปน้อยก่อน