假设我有一个无序的_映射:
std::unordered_map big_objects;在哪里BigObject是这样的:
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不是吗?
即
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这是正确的吗?
发布于 2020-12-29 18:11:56
是的,这是正确的,这就是为什么try_emplace存在时,如果键已经存在,它不会接触到它的参数。
Cppreferencetry_emplace
与insert或emplace不同,如果插入没有发生,这些函数不会从rvalue参数移动,这使得操作其值为仅移动类型的映射变得很容易,例如std::map。此外,尝试_
emplace将键和参数处理到映射的_单独键入,这与emplace不同,emplace需要参数来构造值_类型(即std::对)
作为加分,您不必使用丑陋的std::piecewise_construct标记传递键和值构造函数参数(除非您也想就地构造键)。
发布于 2021-02-21 13:49:48
是的,就像这个算法问题:在此处输入图像描述
一种解决方案是:
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%的用户
其他朋友已经回答了这个问题,我认为这是一个很好的例子,说明了两者之间的区别。
https://stackoverflow.com/questions/65490377
复制相似问题