gpt4 book ai didi

c++11 - 使用 emplace 添加到 std::map 时如何避免临时副本?

转载 作者:行者123 更新时间:2023-12-05 06:38:51 25 4
gpt4 key购买 nike

#include <iostream>
#include <map>
using namespace std;

struct FooStruct
{
int a;
int b;
};

int main()
{
map<int, FooStruct> fooMap;
fooMap.emplace<int, FooStruct>(0, {1, 2});
return 0;
}

在防止临时复制方面,以上是 emplace 的正确用法吗?上面的形式是不是比

fooMap.emplace(make_pair<int, FooStruct>(0, {1, 2}));

或者这些形式是否等价,并且都避免创建 FooStruct 的临时副本?

最佳答案

如果您将“正确性”定义为简洁,您可能希望使用 std::map::insert 而不是 std::map::emplace ,如下所示:

fooMap.insert({0, {1, 2}});

使用 emplace 时,您必须像示例中那样明确指定类型,或者在 @max66 建议的情况下在 FooStruct 中明确定义构造函数:

fooMap.emplace(std::piecewise_construct,
std::forward_as_tuple(0),
std::forward_as_tuple(1, 2));

(也不够简洁)。

fooMap.insert({0, {1, 2}}); 不应不同于

fooMap.emplace(make_pair<int, FooStruct>(0, {1, 2}));

就创建的对象数量而言,正如@Swift 指出的那样,它还使用 std::pair 的移动构造函数。

如果“正确”意味着“可编译并在运行时按预期工作”,那么您的两个示例都是正确的。

关于c++11 - 使用 emplace 添加到 std::map 时如何避免临时副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45472787/

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