Multimap ใน C++ STL คืออะไร?
Multimap เป็น associative container ที่คล้ายกับ map แต่อนุญาตให้มีหลายค่าผูกกับคีย์เดียวกันได้ ข้อมูลจัดเรียงอัตโนมัติตามคีย์
ฟังก์ชัน multimap::emplace() คืออะไร?
ฟังก์ชัน multimap::emplace() ประกาศอยู่ใน header <map> ใช้สร้างและแทรกองค์ประกอบใหม่เข้าไปใน multimap โดยตรง (in-place construction) ฟังก์ชันนี้เพิ่มขนาดของ container ขึ้น 1
แตกต่างจาก insert() ที่ต้องสร้างออบเจ็กต์ก่อนแล้วค่อยคัดลอก/ย้ายเข้าไป emplace() สร้างออบเจ็กต์โดยตรงในหน่วยความจำของ container ลด overhead การคัดลอกหรือย้าย (copy/move)
รูปแบบไวยากรณ์ (Syntax)
multimap_name.emplace(Args& val);
พารามิเตอร์
- val - อาร์กิวเมนต์สำหรับสร้างองค์ประกอบใหม่ (ส่งต่อไปยัง constructor ของ value_type)
ค่าที่ส่งคืน (Return Value)
คืนค่า iterator ชี้ไปยังตำแหน่งที่แทรกองค์ประกอบใหม่
ตัวอย่างการใช้งาน
#include <bits/stdc++.h>
using namespace std;
int main() {
// สร้าง container
multimap<int, int> mul;
// แทรกข้อมูลด้วย emplace
mul.emplace(1, 10);
mul.emplace(4, 20);
mul.emplace(5, 30);
mul.emplace(2, 40);
mul.emplace(3, 50);
mul.emplace(4, 60);
cout << "\nElements in multimap is: \n";
cout << "KEY\tELEMENT\n";
for (auto i = mul.begin(); i != mul.end(); i++) {
cout << i->first << "\t" << i->second << endl;
}
return 0;
}
ผลลัพธ์
Elements in multimap is: KEY ELEMENT 1 10 2 40 3 50 4 20 4 60 5 30
emplace() vs insert()
| ด้านเปรียบเทียบ | emplace() | insert() |
|---|---|---|
| การสร้างออบเจ็กต์ | In-place (ใน container โดยตรง) | สร้างนอก container แล้ว copy/move เข้าไป |
| พารามิเตอร์ | Constructor arguments | value_type object หรือ pair |
| ประสิทธิภาพ | ดีกว่า (หลีกเลี่ยง copy/move) | อาจมี overhead |
| ความสะดวก | สะดวกกว่าสำหรับ complex objects | ต้องสร้าง pair ก่อน |
สรุป
emplace() เป็นวิธีที่แนะนำสำหรับการแทรกข้อมูลใน multimap (และ associative containers อื่นๆ) ใน C++11 ขึ้นไป เนื่องจากมีประสิทธิภาพดีกว่าและโค้ดอ่านง่ายกว่า โดยเฉพาะเมื่อ value_type มี constructor ที่ซับซ้อน