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

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

Forward List คืออะไร?

Forward list เป็นคอนเทนเนอร์แบบลำดับที่อนุญาตให้แทรกและลบข้อมูลได้ในเวลาคงที่ทุกตำแหน่งภายในลำดับ Forward list ถูกนำมาใช้งานเป็น singly-linked list การจัดลำดับถูกเก็บรักษาโดยการเชื่อมโยงแต่ละองค์ประกอบไปยังองค์ประกอบถัดไปในลำดับ

forward_list::swap() คืออะไร?

forward_list::swap() เป็นฟังก์ชันในไลบรารีมาตรฐาน C++ ที่ใช้สำหรับ สลับเนื้อหาของ forward list หนึ่งกับอีก forward list หนึ่ง ที่มีขนาดและชนิดข้อมูลเหมือนกัน การสลับนี้ทำงานในเวลาคงที่ (constant time) เนื่องจากเพียงสลับตัวชี้ (pointers) ภายในเท่านั้น ไม่ต้องคัดลอกองค์ประกอบแต่ละตัว

ไวยากรณ์ (Syntax)

forward_list1.swap(forward_list2)

หรือใช้ฟังก์ชันอิสระ (non-member function):

swap(forward_list1, forward_list2)

ตัวอย่างการทำงาน

ก่อนสลับ:
List1: 57 99 54 34 84
List2: 45 65 78 96 77

หลังสลับ:
List1: 45 65 78 96 77
List2: 57 99 54 34 84

แนวทางการเขียนโปรแกรม

  1. กำหนดค่าเริ่มต้นให้ forward list สองตัว
  2. พิมพ์ forward list ทั้งสองก่อนสลับ
  3. เรียกใช้ฟังก์ชัน swap()
  4. พิมพ์ forward list หลังสลับแล้ว

ตัวอย่างโค้ดที่แก้ไขแล้ว (โค้ดต้นฉบับมีข้อผิดพลาดมาก)

// C++ code to demonstrate the working of forward_list::swap()
#include <forward_list>
#include <iostream>
using namespace std;

int main() {
    // กำหนดค่าเริ่มต้นสอง forward list
    forward_list<int> list1 = {10, 20, 30, 40, 50};
    cout << "องค์ประกอบของ List1: ";
    for (auto x = list1.begin(); x != list1.end(); ++x)
        cout << *x << " ";
    forward_list<int> list2 = {40, 30, 20, 10, 50};
    cout << "\nองค์ประกอบของ List2: ";
    for (auto x = list2.begin(); x != list2.end(); ++x)
        cout << *x << " ";
    // เรียกใช้ฟังก์ชันที่ทำการสลับ
    list1.swap(list2); // หรือ swap(list1, list2);
    cout << "\nหลังสลับ List1 คือ: ";
    for (auto x = list1.begin(); x != list1.end(); ++x)
        cout << *x << " ";
    cout << "\nหลังสลับ List2 คือ: ";
    for (auto x = list2.begin(); x != list2.end(); ++x)
        cout << *x << " ";
    return 0;
}

ผลลัพธ์ (Output)

องค์ประกอบของ List1: 10 20 30 40 50
องค์ประกอบของ List2: 40 30 20 10 50
หลังสลับ List1: 40 30 20 10 50
หลังสลับ List2: 10 20 30 40 50

แก้ไขข้อผิดพลาดจากโค้ดต้นฉบับ:

  • ใช้ #include <forward_list> และ #include <iostream> แทน .h แบบเก่า
  • ใช้ list1.begin() และ list1.end() แทน list1.start() (ไม่มีฟังก์ชัน start() ใน forward_list)
  • แก้ไขลูปพิมพ์ List2 หลังสลับ: ใช้ list2.begin() และ list2.end() แทนที่จะใช้ list1 ซ้ำ
  • แก้ไขตัวพิมพ์และเครื่องหมายคำพูดให้ถูกต้อง

ข้อดีของ swap(): ทำงานในเวลา O(1) คงที่ ไม่ขึ้นกับขนาดของลิสต์ เนื่องจากเพียงสลับตัวชี้ภายใน (internal pointers) เท่านั้น