Câu trả lời cho câu hỏi này cũng phụ thuộc vào việc tạo ra loại giá trị mà bạn đang lưu trữ trong bản đồ tốn kém như thế nào:
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) {
// insertion took place (ie. new entry)
}
else if ( replaceEntry ( ir.first->first ) ) {
ir.second->second = v;
}
}
Đối với một loại giá trị chẳng hạn như int, ở trên sẽ hiệu quả hơn một tìm kiếm theo sau bởi một chèn (trong trường hợp không có tối ưu hóa trình biên dịch). Như đã nói ở trên, điều này là do việc tìm kiếm thông qua bản đồ chỉ diễn ra một lần.
Tuy nhiên, lệnh gọi chèn yêu cầu bạn phải có "giá trị" mới được xây dựng:
class LargeDataType { /* ... */ };
typedef std::map <int, LargeDataType> MapOfLargeDataType;
typedef std::pair <MapOfLargeDataType::iterator, bool> IResult;
void foo (MapOfLargeDataType & m, int k) {
// This call is more expensive than a find through the map:
LargeDataType const & v = VeryExpensiveCall ( /* ... */ );
IResult ir = m.insert (std::make_pair (k, v));
if (ir.second) {
// insertion took place (ie. new entry)
}
else if ( replaceEntry ( ir.first->first ) ) {
ir.second->second = v;
}
}
Để gọi 'chèn', chúng tôi đang trả tiền cho cuộc gọi đắt tiền để xây dựng loại giá trị của chúng tôi - và từ những gì bạn đã nói trong câu hỏi, bạn sẽ không sử dụng giá trị mới này 20% thời gian. Trong trường hợp trên, nếu thay đổi kiểu giá trị bản đồ không phải là một tùy chọn thì sẽ hiệu quả hơn trước tiên thực hiện 'tìm kiếm' để kiểm tra xem chúng ta có cần xây dựng phần tử hay không.
Ngoài ra, loại giá trị của bản đồ có thể được thay đổi để lưu trữ các chốt cho dữ liệu bằng cách sử dụng loại con trỏ thông minh yêu thích của bạn. Lệnh gọi chèn sử dụng một con trỏ null (cấu tạo rất rẻ) và chỉ khi cần thiết thì kiểu dữ liệu mới được xây dựng.