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

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

Multimap ใน C++ STL คืออะไร?

Multimap เป็น associative container ที่คล้ายกับ map แต่อนุญาตให้มีหลายค่าผูกกับคีย์เดียวกันได้ ข้อมูลจัดเรียงอัตโนมัติตามคีย์

ฟังก์ชัน multimap::erase() คืออะไร?

ฟังก์ชัน multimap::erase() ประกาศอยู่ใน header <map> ใช้ลบองค์ประกอบออกจาก multimap container สามารถลบได้ 3 แบบ: ตามคีย์, ตามตำแหน่ง (iterator), หรือตามช่วง (range) ขนาดของ container จะลดลงตามจำนวนองค์ประกอบที่ลบ

รูปแบบไวยากรณ์ (Syntax)

// 1. ลบตามคีย์ (ลบทุกค่าที่มีคีย์นี้)
multimap_name.erase(key_type key);

// 2. ลบตามตำแหน่ง iterator เดี่ยว
multimap_name.erase(const_iterator it);

// 3. ลบตามช่วง iterator
multimap_name.erase(const_iterator start, const_iterator end);

พารามิเตอร์

  • key - คีย์ขององค์ประกอบที่ต้องการลบ (จะลบทุกค่าที่มีคีย์นี้)
  • it - iterator ชี้ไปยังองค์ประกอบที่ต้องการลบ
  • start, end - ช่วง [start, end) ขององค์ประกอบที่ต้องการลบ

ค่าที่ส่งคืน (Return Value)

  • รูปแบบที่ 1: คืนค่าจำนวนองค์ประกอบที่ลบ (size_type)
  • รูปแบบที่ 2 และ 3: คืนค่า iterator ชี้ไปยังองค์ประกอบถัดไปหลังจากที่ลบ (C++11 ขึ้นไป) หรือ void (C++98)

ตัวอย่างการใช้งาน

ตัวอย่างที่ 1: ลบตามคีย์

#include <iostream>
#include <map>
using namespace std;

int main() {
    multimap<int, char> mul_1;
    multimap<int, char>::iterator i;
    
    mul_1.insert(make_pair(0, 'a'));
    mul_1.insert(make_pair(1, 'b'));
    mul_1.insert(make_pair(2, 'c'));
    mul_1.insert(make_pair(3, 'd'));
    mul_1.insert(make_pair(4, 'e'));
    mul_1.insert(make_pair(5, 'f'));
    mul_1.insert(make_pair(6, 'g'));
    
    // ลบคีย์ 1, 4, 6, 5
    mul_1.erase(1);
    mul_1.erase(4);
    mul_1.erase(6);
    mul_1.erase(5);
    
    cout << "Elements in multimap1 are: " << "\n";
    for (i = mul_1.begin(); i != mul_1.end(); i++) {
        cout << (*i).first << " " << (*i).second << "\n";
    }
    return 0;
}

ผลลัพธ์

Elements in multimap1 are:
0 a
2 c
3 d

ตัวอย่างที่ 2: ลบตามช่วง (range)

#include <iostream>
#include <map>
using namespace std;

int main() {
    multimap<int, char> mul_1;
    multimap<int, char>::iterator i;
    
    mul_1.insert(make_pair(0, 'a'));
    mul_1.insert(make_pair(1, 'b'));
    mul_1.insert(make_pair(2, 'c'));
    mul_1.insert(make_pair(3, 'd'));
    mul_1.insert(make_pair(4, 'e'));
    mul_1.insert(make_pair(5, 'f'));
    mul_1.insert(make_pair(6, 'g'));
    
    cout << "Before erase:\n";
    for (i = mul_1.begin(); i != mul_1.end(); i++) {
        cout << (*i).first << " " << (*i).second << "\n";
    }
    
    // ลบช่วงจากคีย์ 3 ถึง 6 (ไม่รวม 6)
    auto start = mul_1.find(3);
    auto end = mul_1.find(6);
    mul_1.erase(start, end);
    
    cout << "\nAfter erase:\n";
    for (i = mul_1.begin(); i != mul_1.end(); i++) {
        cout << (*i).first << " " << (*i).second << "\n";
    }
    return 0;
}

ผลลัพธ์

Before erase:
0 a
1 b
2 c
3 d
4 e
5 f
6 g

After erase:
0 a
1 b
2 c
6 g

ตัวอย่างที่ 3: ลบตามตำแหน่ง iterator เดี่ยว

#include <iostream>
#include <map>
using namespace std;

int main() {
    multimap<int, char> mul_1;
    multimap<int, char>::iterator i;
    
    mul_1.insert(make_pair(0, 'a'));
    mul_1.insert(make_pair(1, 'b'));
    mul_1.insert(make_pair(2, 'c'));
    mul_1.insert(make_pair(3, 'd'));
    mul_1.insert(make_pair(4, 'e'));
    mul_1.insert(make_pair(5, 'f'));
    mul_1.insert(make_pair(6, 'g'));
    
    cout << "Before erase:\n";
    for (i = mul_1.begin(); i != mul_1.end(); i++) {
        cout << (*i).first << " " << (*i).second << "\n";
    }
    
    // ลบที่ iterator ชี้อยู่
    auto first = mul_1.find(1);
    mul_1.erase(first);
    
    auto second = mul_1.find(6);
    mul_1.erase(second);
    
    auto third = mul_1.find(2);
    mul_1.erase(third);
    
    cout << "\nAfter erase:\n";
    for (i = mul_1.begin(); i != mul_1.end(); i++) {
        cout << (*i).first << " " << (*i).second << "\n";
    }
    return 0;
}

ผลลัพธ์

Before erase:
0 a
1 b
2 c
3 d
4 e
5 f
6 g

After erase:
0 a
3 d
4 e
5 f

ข้อควรระวัง

  • Iterator invalidation - Iterator ที่ชี้ไปยังองค์ประกอบที่ถูกลบจะ invalid อื่นๆ ยัง valid อยู่
  • Erase ใน loop - ต้องใช้ pattern: it = mul.erase(it); (C++11) หรือ mul.erase(it++); (C++98)
  • Erase by key - ลบทุกค่าที่มีคีย์นั้น ไม่ใช่แค่ค่าแรก

สรุป

erase() เป็นฟังก์ชันหลักสำหรับลบข้อมูลใน multimap มี 3 overload รองรับการลบแบบต่างๆ เลือกใช้ตามความเหมาะสม: erase(key) สำหรับลบคีย์ทั้งหมด, erase(it) สำหรับลบตำแหน่งเฉพาะ, erase(first, last) สำหรับลบช่วง