gpt4 book ai didi

c++ - 插入时调用 std::map 值对象的成员函数

转载 作者:行者123 更新时间:2023-12-02 10:27:38 27 4
gpt4 key购买 nike

我有一个 std::map类型 std::map<key, value> .
我想在类型键上定义一个函数 f

void f(key k){
// stuff
}
执行以下操作:
  • 如果 map 中没有值 v 与等效键 k`==k,则插入 std::make_pair(k, values(k))进 map 。
  • 如果map中有一个值v对应的key,k'==k,那么在k上调用v的成员函数g(v.g(k))

  • 我提出了两种解决方案,但由于不同的原因,两者都没有效率。首先:
    auto [iter, success] = myMap.insert(k, value(k));
    if (!success){
    (iter -> second).g(k);
    }
    这里的问题是我必须调用构造函数 value(k)调用 insert .如果一个元素的键等于 k已经出现在 map 中,那么我不需要构造 value 类型的对象.
    另一种解决方案是先使用 find查看一个元素的键是否等于 k出现在 map 中。但是,如果不存在这样的元素,那么我将需要再次搜索 myMap 以找到 (k, value(k)) 的插入点.
    有没有办法通过 myMap 搜索一次并且不调用 value 的构造函数?什么时候不需要?

    最佳答案

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

    auto [iter, success] = myMap.try_emplace(k, k);
    if (!success){
    (iter -> second).g(k);
    }
    根据手册,如果 key 不存在,它将就地插入,如果 key 存在,则不执行任何操作。
    std::map<Key,T,Compare,Allocator>::try_emplace

    关于c++ - 插入时调用 std::map 值对象的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63639805/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com