Multimap ใน C++ STL คืออะไร?
Multimap เป็น associative container ที่คล้ายกับ map แต่อนุญาตให้มีหลายค่าผูกกับคีย์เดียวกันได้ ข้อมูลจัดเรียงอัตโนมัติตามคีย์
ฟังก์ชัน multimap::emplace_hint() คืออะไร?
ฟังก์ชัน multimap::emplace_hint() ประกาศอยู่ใน header <map> ใช้แทรกองค์ประกอบใหม่เข้าไปใน multimap พร้อมกับ position hint (iterator ที่บอกตำแหน่งประมาณว่าควรแทรกที่ไหน) ฟังก์ชันนี้คล้ายกับ emplace() แต่แตกต่างที่รับ hint iterator เพิ่มเติม ช่วยเพิ่มประสิทธิภาพการแทรกหาก hint ใกล้ตำแหน่งจริง
รูปแบบไวยากรณ์ (Syntax)
multimap_name.emplace_hint(iterator pos, Args& val);
พารามิเตอร์
- pos - iterator ที่ใช้เป็น position hint (ตำแหน่งประมาณที่ควรแทรก)
- val - อาร์กิวเมนต์สำหรับสร้างองค์ประกอบใหม่
ค่าที่ส่งคืน (Return Value)
คืนค่า iterator ชี้ไปยังตำแหน่งที่แทรกองค์ประกอบใหม่
ตัวอย่างการใช้งาน
#include <bits/stdc++.h>
using namespace std;
int main() {
// สร้าง container
multimap<int, int> mul;
// แทรกข้อมูลด้วย emplace_hint ใช้ mul.begin() เป็น hint
mul.emplace_hint(mul.begin(), 1, 10);
mul.emplace_hint(mul.begin(), 2, 20);
mul.emplace_hint(mul.begin(), 3, 30);
mul.emplace_hint(mul.begin(), 1, 40);
mul.emplace_hint(mul.begin(), 4, 50);
mul.emplace_hint(mul.begin(), 5, 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 40 1 10 2 20 3 30 4 50 5 60
ความแตกต่างระหว่าง emplace() และ emplace_hint()
| ฟังก์ชัน | พารามิเตอร์ | ประสิทธิภาพ |
|---|---|---|
| emplace(args...) | แค่ arguments | O(log n) เสมอ |
| emplace_hint(pos, args...) | hint iterator + arguments | O(1) amortized หาก hint ใกล้ตำแหน่งจริง, ไม่เช่นนั้น O(log n) |
เมื่อใดควรใช้ emplace_hint()
- เมื่อทราบตำแหน่งประมาณที่จะแทรก (เช่น แทรกข้อมูลที่เรียงลำดับแล้ว)
- เมื่อแทรกข้อมูลจำนวนมากแบบ sequential
- เมื่อต้องการ optimize การแทรกใน hot path
สรุป
emplace_hint() เป็นการ optimize การแทรกข้อมูลใน multimap โดยให้ compiler/runtume รู้ตำแหน่งประมาณ จะมีประโยชน์มากเมื่อ hint ใกล้เคียงตำแหน่งจริง แต่หาก hint ผิดมากอาจไม่มีประโยชน์หรือช้ากว่า emplace() ปกติ