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
แนวทางการเขียนโปรแกรม
- กำหนดค่าเริ่มต้นให้ forward list สองตัว
- พิมพ์ forward list ทั้งสองก่อนสลับ
- เรียกใช้ฟังก์ชัน swap()
- พิมพ์ 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) เท่านั้น