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

ฟังก์ชัน list::erase() ใน C++ STL

ฟังก์ชัน list::erase() ใน C++ STL

list::erase() คืออะไร?

ลบองค์ประกอบจาก list container ได้ทั้งตัวเดียว (by iterator) หรือช่วง (range of iterators) ลดขนาด container ตามจำนวนที่ลบ

Syntax

list_container.erase(position);
list_container.erase(start_position, end_position);

พารามิเตอร์

  • position - iterator ชี้ไปองค์ประกอบที่ต้องการลบ
  • start_position, end_position - ช่วง [first, last) ที่ต้องการลบ

คืนค่า

Iterator ชี้ไปองค์ประกอบถัดจากตัวสุดท้ายที่ถูกลบ (หรือ end() ถ้าลบจนหมด)

ตัวอย่าง 1: ลบองค์ประกอบเดียว (ตัวแรก)

#include <bits/stdc++.h>
using namespace std;

int main() {
    list<int> myList = {2, 4, 6, 8, 10};
    
    cout << "List before deleting elements: ";
    for (auto i = myList.begin(); i != myList.end(); i++) cout << *i << " ";
    
    auto it = myList.begin();  // iterator ชี้ตัวแรก
    myList.erase(it);          // ลบ 2
    
    cout << "\nList after deleting elements: ";
    for (auto i = myList.begin(); i != myList.end(); i++) cout << *i << " ";
    return 0;
}

Output: List before: 2 4 6 8 10 → after: 4 6 8 10

ตัวอย่าง 2: ลบช่วง (Range Erase)

#include <bits/stdc++.h>
using namespace std;

int main() {
    list<int> myList = {2, 4, 6, 8, 10};
    
    cout << "List before deleting elements: ";
    for (auto i = myList.begin(); i != myList.end(); i++) cout << *i << " ";
    
    auto it1 = myList.begin();
    auto it2 = myList.begin();
    advance(it2, 4);  // ขยับ it2 ไป 4 ตำแหน่ง (ชี้ 10)
    
    myList.erase(it1, it2);  // ลบ [it1, it2) คือ 2,4,6,8
    
    cout << "\nList after deleting elements: ";
    for (auto i = myList.begin(); i != myList.end(); i++) cout << *i << " ";
    return 0;
}

Output: List before: 2 4 6 8 10 → after: 10

ข้อสังเกต

  • Invalidates เฉพาะ iterator ขององค์ประกอบที่ถูกลบ (iterator อื่นคงอยู่)
  • ใช้ std::advance ย้าย iterator (list ไม่มี random access)
  • Complexity: O(1) สำหรับ single erase, O(k) สำหรับ range erase (k = จำนวนที่ลบ)