Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ฟังก์ชัน multimap::emplace_hint() ใน C++ STL

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...)แค่ argumentsO(log n) เสมอ
emplace_hint(pos, args...)hint iterator + argumentsO(1) amortized หาก hint ใกล้ตำแหน่งจริง, ไม่เช่นนั้น O(log n)

เมื่อใดควรใช้ emplace_hint()

  • เมื่อทราบตำแหน่งประมาณที่จะแทรก (เช่น แทรกข้อมูลที่เรียงลำดับแล้ว)
  • เมื่อแทรกข้อมูลจำนวนมากแบบ sequential
  • เมื่อต้องการ optimize การแทรกใน hot path

สรุป

emplace_hint() เป็นการ optimize การแทรกข้อมูลใน multimap โดยให้ compiler/runtume รู้ตำแหน่งประมาณ จะมีประโยชน์มากเมื่อ hint ใกล้เคียงตำแหน่งจริง แต่หาก hint ผิดมากอาจไม่มีประโยชน์หรือช้ากว่า emplace() ปกติ