首页 > 解决方案 > 插入时调用 std::map 值对象的成员函数

问题描述

我有一个std::map类型std::map<key, value>

我想在类型键上定义一个函数 f

void f(key k){
// stuff
}

执行以下操作:

  1. 如果 map 中没有值 v 具有等效键 k`==k,则插入std::make_pair(k, values(k))到 map 中。
  2. 如果map中有一个值v与等价键,k'==k,那么在k上调用v的成员函数g(vg(k))

我提出了两种解决方案,但由于不同的原因,两者都没有效率。首先:

auto [iter, success] = myMap.insert(k, value(k));
if (!success){
    (iter -> second).g(k);
}

这里的问题是我必须调用构造函数value(k)来调用insert. 如果地图中已经出现了一个与 key 等效的元素k,那么我不需要构造一个 type 的对象value

另一种解决方案是首先使用find来查看一个key等价于的元素是否k出现在map中。但是,如果不存在这样的元素,那么我将需要再次搜索 myMap 以找到(k, value(k)).

有没有一种方法可以通过 myMap 搜索一次并且在不需要的value时候不调用构造函数?

标签: c++dictionary

解决方案


你可以用 C++17 高效地做到这一点:

auto [iter, success] = myMap.try_emplace(k, k);
if (!success){
    (iter -> second).g(k);
}

根据手册,如果密钥不存在,它将就地插入,如果密钥存在,则不执行任何操作。 std::map<Key,T,Compare,Allocator>::try_emplace


推荐阅读