这个问题的答案也取决于在地图中存储的值类型的创建成本有多昂贵:
这个问题的答案还取决于在地图中存储的值类型的创建成本有多高:
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这样的值类型,上述方法比查找和插入的组合更有效(在没有编译器优化的情况下)。如上所述,这是因为对映射的搜索只发生一次。
然而,调用插入需要你已经构造了新的“value”:
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;
}
}
为了调用“insert”,我们需要为值类型进行昂贵的构造调用,而根据您在问题中所说的,您有20%的时间不会使用此新值。 在上述情况下,如果更改映射值类型不是一个选项,则首先执行“find”以检查是否需要构造元素更有效率。
或者,可以更改映射的值类型,使用您喜欢的智能指针类型存储数据的句柄。调用insert使用空指针(非常便宜的构造方式),仅在必要时构造新的数据类型。