Multimap ใน C++ STL คืออะไร?
Multimap เป็น associative container ที่คล้ายกับ map แต่อนุญาตให้มีหลายค่าผูกกับคีย์เดียวกันได้ ข้อมูลจัดเรียงอัตโนมัติตามคีย์
ฟังก์ชัน multimap::swap() คืออะไร?
ฟังก์ชัน multimap::swap() ประกาศอยู่ใน header <map> ใช้สลับเนื้อหาของ multimap 2 ตัวระหว่างกัน ฟังก์ชันนี้สลับค่าทั้งหมดโดยไม่คำนึงถึงขนาดของทั้งสอง container
เมื่อเรียกใช้ ฟังก์ชันจะรับ multimap อีกตัวหนึ่งเป็นพารามิเตอร์ และสลับเนื้อหากับ container ที่เรียกใช้
รูปแบบไวยากรณ์ (Syntax)
multimap_name.swap(multimap& multimap_name2);
พารามิเตอร์
- map_name2 - multimap container อีกตัวที่ต้องการสลับข้อมูล
ค่าที่ส่งคืน (Return Value)
ฟังก์ชันนี้ไม่ส่งค่าอะไรกลับ (void)
ตัวอย่างการใช้งาน
#include <iostream>
#include <map>
using namespace std;
int main() {
multimap<int, char> mul_1;
multimap<int, char> mul_2;
multimap<int, char>::iterator i;
// แทรกข้อมูลเข้า multimap1
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'));
// แทรกข้อมูลเข้า multimap2
mul_2.insert(make_pair(4, 'e'));
mul_2.insert(make_pair(5, 'f'));
mul_2.insert(make_pair(6, 'g'));
// เรียก swap เพื่อสลับข้อมูล
mul_1.swap(mul_2);
// แสดงข้อมูล multimap1 หลัง swap
cout << "Elements in multimap1 are: " << "\n";
for (i = mul_1.begin(); i != mul_1.end(); i++) {
cout << (*i).first << " " << (*i).second << "\n";
}
// แสดงข้อมูล multimap2 หลัง swap
cout << "\nElements in multimap2 are: ";
for (i = mul_2.begin(); i != mul_2.end(); i++) {
cout << (*i).first << " " << (*i).second << "\n";
}
return 0;
}
ผลลัพธ์
Elements in multimap1 are: 4 e 5 f 6 g Elements in multimap2 are: 0 a 1 b 2 c 3 d
swap() member function vs std::swap()
// Member function (แนะนำ) mul_1.swap(mul_2); // Non-member function (generic) std::swap(mul_1, mul_2);
ทั้งสองให้ผลลัพธ์เหมือนกัน แต่วิธี member function อาจมีประสิทธิภาพดีกว่าเล็กน้อยและเป็น idiomatic C++ มากกว่า
คุณสมบัติสำคัญ (ซ้ำเพื่อความชัดเจน)
- O(1) time complexity - เพียงสลับ internal pointers
- No element copying/moving - ไม่มี overhead การคัดลอกข้อมูล
- Iterator validity preserved - Iterator ยัง valid แต่ชี้ container ตรงข้าม
- noexcept - ไม่โยน exception
สรุป
swap() เป็นวิธีที่มีประสิทธิภาพสูงสุดสำหรับแลกเปลี่ยนข้อมูลระหว่าง multimap 2 ตัว ใช้ใน move semantics, object pooling หรือเมื่อต้องการย้าย ownership ของข้อมูลขนาดใหญ่โดยไม่มี overhead