บทความนี้แสดงการทำงานของฟังก์ชัน list::remove() และ list::remove_if() ใน C++ STL
List ใน STL คืออะไร?
List เป็นคอนเทนเนอร์ที่รองรับการแทรกและลบข้อมูลได้ในเวลาคงที่ (constant time) ที่ตำแหน่งใดก็ได้ในลำดับ List ถูกนำไปใช้งานเป็น doubly linked list ทำให้จัดสรรหน่วยความจำแบบไม่ต่อเนื่องได้ List ให้ประสิทธิภาพการแทรก ดึง และย้ายข้อมูลที่ตำแหน่งใดก็ได้ในคอนเทนเนอร์ดีกว่า array, vector และ deque อย่างไรก็ตาม การเข้าถึงข้อมูลโดยตรง (random access) ใน List ช้ากว่า และ List คล้ายกับ forward_list แต่ forward_list เป็น singly linked list จึงวนลูปได้เฉพาะทิศทางไปข้างหน้าเท่านั้น
list::remove() คืออะไร?
ฟังก์ชันนี้ใช้สำหรับ ลบองค์ประกอบทั้งหมดที่มีค่าเท่ากับค่าที่ส่งผ่านพารามิเตอร์
ไวยากรณ์ (Syntax)
listname.remove(val);
พารามิเตอร์ (Parameters)
- val – ค่าที่ต้องการลบ
ตัวอย่างการใช้งาน
Input List: 1 2 3 3 4 5 Output New List: 1 2 4 5 (ลบ 3 ทั้งหมด) Input List: 5 6 7 8 8 8 9 Output New List: 5 7 8 8 8 9 (ลบ 6)
แนวทางการใช้งาน
- ประกาศ List
- พิมพ์ List
- เรียกใช้ remove() function
ตัวอย่างโค้ดเต็ม
#include <iostream>
#include <list>
using namespace std;
int main() {
list<int> list = { 21, 24, 28, 26, 27, 25 };
// พิมพ์ list
cout << "List: ";
for(auto x = list.begin(); x != list.end(); ++x)
cout << *x << " ";
// เรียก remove()
list.remove(27);
cout << "\nNew List: ";
for(auto x = list.begin(); x != list.end(); ++x)
cout << *x << " ";
return 0;
}
ผลลัพธ์ (Output)
Input - List: 21 24 28 26 27 25 Output - New List: 21 24 28 26 25
list::remove_if() คืออะไร?
ฟังก์ชันนี้ใช้สำหรับ ลบองค์ประกอบที่ทำให้ predicate (เงื่อนไข) ส่งคืน true
ไวยากรณ์ (Syntax)
listname.remove_if(predicate)
พารามิเตอร์ (Parameters)
- predicate – ฟังก์ชันหรือ lambda ที่รับค่าและส่งคืน bool (true = ลบ, false = เก็บ)
ตัวอย่างการใช้งาน
Input List: 5 6 7 8 9 10 Output New List: 5 7 9 (ลบเลขคู่ทั้งหมด) Input List: 5 10 15 20 25 30 Output New List: 5 15 25 (ลบตัวเลขที่หาร 10 ลงตัว)
แนวทางการใช้งาน
- ประกาศ predicate function
- ประกาศ list
- พิมพ์ list
- เรียก remove_if() พร้อมส่ง predicate
ตัวอย่างโค้ดเต็ม
#include <iostream>
#include <list>
using namespace std;
// Predicate: true ถ้าหาร 3 ลงตัว
bool div3(const int& val) {
return (val % 3) == 0;
}
int main() {
list<int> list = { 2, 3, 4, 15, 9, 7, 21, 24, 13 };
cout << "List: ";
for(auto x = list.begin(); x != list.end(); ++x)
cout << *x << " ";
// เรียก remove_if()
list.remove_if(div3);
cout << "\nNew List: ";
for(auto x = list.begin(); x != list.end(); ++x)
cout << *x << " ";
return 0;
}
ผลลัพธ์ (Output)
Input - List: 2 3 4 15 9 7 21 24 13 Output - New List: 2 4 7 13