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) สำหรับลบช่วง