首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >map emplace与try_emplace的行为?

map emplace与try_emplace的行为?
EN

Stack Overflow用户
提问于 2020-12-29 17:59:00
回答 2查看 555关注 0票数 2

假设我有一个无序的_映射:

代码语言:javascript
复制
std::unordered_map big_objects;

在哪里BigObject是这样的:

代码语言:javascript
复制
struct BigObject {
    BigObject(P1, P2, P3); // <--- expensive
    /*...*/
};

我有一个Key k,和一组参数BigObject%s构造函数P1 p1,P2 p2和P3 p3..。如果big_objects已包含k我什么都不想做。如果big_objects不包含K我想构造和插入BigObject(p1,p2,p3)

是否可以通过对big_objects单次查找来做到这一点?

ie将emplace或者try_emplace构造BigObject如果密钥已经存在?

更新

经过一些测试,它看起来像是emplace确实构造了BigObject但是try_emplace不是吗?

代码语言:javascript
复制
big_objects[k] = BigObject(p1,p2,p3) // insert k, k now present...

big_objects.emplace(k, p1, p2, p3); // does construct a BigObject

big_objects.try_emplace(k, p1, p2, p3); // does not construct a BigObject

这是正确的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-29 18:11:56

是的,这是正确的,这就是为什么try_emplace存在时,如果键已经存在,它不会接触到它的参数。

Cppreferencetry_emplace

与insert或emplace不同,如果插入没有发生,这些函数不会从rvalue参数移动,这使得操作其值为仅移动类型的映射变得很容易,例如std::map。此外,尝试_

emplace将键和参数处理到映射的_单独键入,这与emplace不同,emplace需要参数来构造值_类型(即std::对)

作为加分,您不必使用丑陋的std::piecewise_construct标记传递键和值构造函数参数(除非您也想就地构造键)。

票数 2
EN

Stack Overflow用户

发布于 2021-02-21 13:49:48

是的,就像这个算法问题:在此处输入图像描述

一种解决方案是:

代码语言:javascript
复制
int findShortestSubArray(vector& nums) 
{
    std::unordered_map> map;
    int s = nums.size();
    for(int i = 0; i < s; ++i)
    {
        if(!map.try_emplace(nums.at(i), std::tuple{1,i,i}).second)
        {
            ++std::get<0>(map.at(nums.at(i)));
            std::get<2>(map.at(nums.at(i))) = i;
        }                
    }
    //...
}

此解决方案从try_emplace()并使用它作为if语句的条件,以非常好的时空开销结束:

执行时间: 32ms,在所有C++提交中击败97.50%的用户

内存消耗: 24.3MB,在所有C++提交中击败93.47%的用户

但如果我替换掉try_emplace()使用emplace(),时空成本将会膨胀:

执行时间: 84ms,在所有C++提交中击败61.24%的用户

内存消耗: 33.8MB,超过所有C++提交的6.65%的用户

其他朋友已经回答了这个问题,我认为这是一个很好的例子,说明了两者之间的区别。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65490377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档