Multimap ใน C++ STL คืออะไร?
Multimap เป็น associative container ที่คล้ายกับ map แต่อนุญาตให้มีหลายค่าผูกกับคีย์เดียวกันได้ ข้อมูลจัดเรียงอัตโนมัติตามคีย์
ฟังก์ชัน multimap::insert() คืออะไร?
ฟังก์ชัน multimap::insert() ประกาศอยู่ใน header <map> ใช้แทรกค่าใหม่เข้าไปใน multimap container และเพิ่มขนาดของ container ตามจำนวนองค์ประกอบที่แทรก
แตกต่างจาก map ธรรมดาที่จะไม่แทรกหากคีย์ซ้ำ multimap จะอนุญาตให้แทรกคีย์ซ้ำได้หลายครั้ง ข้อมูลใหม่จะวางในตำแหน่งที่เหมาะสมตามลำดับคีย์
รูปแบบไวยากรณ์ (Syntax)
มี 4 รูปแบบการเรียกใช้:
// 1. แทรกคีย์-ค่าเดี่ยว
multiMap_name.insert({key& k, value_type& val});
// 2. แทรกพร้อม position hint
multiMap_name.insert(iterator& it, {key& k, value_type& val});
// 3. แทรกช่วงข้อมูล (range)
multiMap_name.insert(iterator& position1, iterator& position2);
// 4. แทรกจาก initializer list
multimap_name.insert(initializer_list<value_type> il);
พารามิเตอร์
- k - คีย์ที่ผูกกับองค์ประกอบ
- val - ค่าที่ต้องการแทรก
- it - iterator ให้ position hint
- position1, position2 - ช่วงเริ่มต้นและสิ้นสุดของข้อมูลที่ต้องการแทรก
- il - initializer list ของข้อมูลที่ต้องการแทรก
ค่าที่ส่งคืน (Return Value)
คืนค่า iterator ชี้ไปยังองค์ประกอบที่แทรกใหม่ (สำหรับรูปแบบที่ 1 และ 2) หรือ void (สำหรับรูปแบบที่ 3 และ 4)
ตัวอย่างการใช้งาน
ตัวอย่างที่ 1: แทรกที่ตำแหน่งตามคีย์
#include <bits/stdc++.h>
using namespace std;
int main() {
multimap<int, int> mul;
mul.insert({1, 10});
mul.insert({2, 20});
mul.insert({3, 30});
mul.insert({4, 40});
mul.insert({5, 50});
cout << "Elements in multimap is: \n";
cout << "KEY\tELEMENT\n";
for (auto it = mul.begin(); it != mul.end(); ++it) {
cout << it->first << '\t' << it->second << '\n';
}
return 0;
}
ผลลัพธ์
Elements in multimap is: KEY ELEMENT 1 10 2 20 3 30 4 40 5 50
ตัวอย่างที่ 2: แทรกหลังคีย์ที่กำหนด (position hint)
#include <bits/stdc++.h>
using namespace std;
int main() {
multimap<int, int> mul;
mul.insert({1, 10});
mul.insert({2, 20});
mul.insert({3, 30});
mul.insert({5, 40});
mul.insert({6, 50});
// หาตำแหน่งคีย์ 3 แล้วแทรก 4, 90 หลังจากนั้น
auto i = mul.find(3);
mul.insert(i, {4, 90});
cout << "KEY\tELEMENT\n";
for (auto itr = mul.begin(); itr != mul.end(); ++itr) {
cout << itr->first << '\t' << itr->second << '\n';
}
return 0;
}
ผลลัพธ์
KEY ELEMENT 1 10 2 20 3 30 4 90 5 40 6 50
สรุป
insert() เป็นฟังก์ชันพื้นฐานสำหรับเพิ่มข้อมูลใน multimap มี overload หลายรูปแบบรองรับการใช้งานต่างๆ เช่น แทรกเดี่ยว แทรกพร้อม hint แทรกช่วงข้อมูล และแทรกจาก initializer list เหมาะสำหรับกรณีทั่วไปที่ไม่ต้องการ optimization ระดับสูงของ emplace()