คำตอบสำหรับคำถามนี้ยังขึ้นอยู่กับราคาแพงในการสร้างประเภทมูลค่าที่คุณจัดเก็บไว้ในแผนที่:
typedef std::map <int, int> MapOfInts;
typedef std::pair <MapOfInts::iterator, bool> IResult;
void foo (MapOfInts & m, int k, int v) {
IResult ir = m.insert (std::make_pair (k, v));
if (ir.second) {
}
else if ( replaceEntry ( ir.first->first ) ) {
ir.first->second = v;
}
}
สำหรับประเภทค่าเช่น int ข้างต้นจะมีประสิทธิภาพมากกว่าการค้นหาตามด้วยส่วนแทรก (ในกรณีที่ไม่มีการปรับแต่งคอมไพลเลอร์ให้เหมาะสม) ตามที่ระบุไว้ข้างต้นเนื่องจากการค้นหาผ่านแผนที่จะเกิดขึ้นเพียงครั้งเดียว
อย่างไรก็ตามการเรียกเพื่อแทรกต้องการให้คุณสร้าง "ค่า" ใหม่ไว้แล้ว:
class LargeDataType { };
typedef std::map <int, LargeDataType> MapOfLargeDataType;
typedef std::pair <MapOfLargeDataType::iterator, bool> IResult;
void foo (MapOfLargeDataType & m, int k) {
LargeDataType const & v = VeryExpensiveCall ( );
IResult ir = m.insert (std::make_pair (k, v));
if (ir.second) {
}
else if ( replaceEntry ( ir.first->first ) ) {
ir.first->second = v;
}
}
ในการเรียก 'แทรก' เราจะจ่ายค่าโทรแพงเพื่อสร้างประเภทมูลค่าของเรา - และจากสิ่งที่คุณพูดในคำถามคุณจะไม่ใช้ค่าใหม่นี้ 20% ของเวลา ในกรณีข้างต้นหากการเปลี่ยนประเภทค่าแผนที่ไม่ใช่ตัวเลือกการ 'ค้นหา' จะมีประสิทธิภาพมากกว่าก่อนเพื่อตรวจสอบว่าเราจำเป็นต้องสร้างองค์ประกอบหรือไม่
อีกวิธีหนึ่งคือสามารถเปลี่ยนประเภทค่าของแผนที่เพื่อจัดเก็บที่จับไปยังข้อมูลโดยใช้ประเภทตัวชี้อัจฉริยะที่คุณชื่นชอบ การเรียกเพื่อแทรกใช้ตัวชี้ค่าว่าง (ถูกมากในการสร้าง) และเฉพาะในกรณีที่จำเป็นเท่านั้นที่จะสร้างชนิดข้อมูลใหม่