c++ - 插入时调用 std::map 值对象的成员函数
问题描述
我有一个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与等价键,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++17 高效地做到这一点:
auto [iter, success] = myMap.try_emplace(k, k);
if (!success){
(iter -> second).g(k);
}
根据手册,如果密钥不存在,它将就地插入,如果密钥存在,则不执行任何操作。 std::map<Key,T,Compare,Allocator>::try_emplace
推荐阅读
- android - 如何以类似于相机为 SurfaceTexture 生成帧的方式生成 YUVI420 帧到 SurfaceTexture?
- reactjs - reactjs中的解密密钥存储在哪里?
- c++ - 具有指向函数的指针的类内的结构需要在类外前向声明函数?
- spring - 由于 Consul,Spring Boot 应用程序健康状态下降
- snowflake-cloud-data-platform - 以特定字符串开头的所有表上的 UNION ALL
- javascript - 如何使用从 API 获取的图像在 div 上生成动态轮播
- visual-studio - VS 2017 不执行快速更新检查共享 bin 目录是否用于本地构建
- matlab - 如何在这样的范围内生成随机数?
- java - `java -Dspring.profiles.active -jar xxx.jar`和`java -jar xxx.jar --spring.profiles.active`有什么区别
- angular - 带窗口内宽的 Angular Universal