gpt4 book ai didi

c++ - 基本类型的 emplace 值得吗?

转载 作者:可可西里 更新时间:2023-11-01 18:26:15 25 4
gpt4 key购买 nike

假设我有一个 map<int, int> :

std::map<int, int> map;

map.emplace(1, 2);
map.insert({3, 4});

这两个调用会有什么区别吗?

在第一次调用中,这两个整数将按值复制到emplace。功能,然后再次到 std::pair<int, int>构造函数。在第二次调用中,这两个整数将按值复制到 std::pair<int, int>。构造函数,然后按值复制到内部 std::pair<int, int>再次作为第一对的成员。

我了解 emplace 对 std::string 等类型的好处它们将在第二次调用中按值复制并在第一次调用中一直移动,但是使用 emplace 有什么好处吗?在所描述的情况下?

最佳答案

Emplace 比较慢,如果 emplace 有可能会失败( key 已经存在)。

这是因为 emplace需要分配一个节点并构造 pair<Key const, Value>进入其中,然后从该节点中提取 key 并检查该 key 是否已经存在,如果该 key 已经存在则释放该节点。另一方面insert可以从要插入的传递值中提取键,因此如果插入失败则不需要分配节点。请参阅:performance of emplace is worse than check followed by emplace .

为了解决这个问题,C++17 添加了一个成员函数 try_emplace(const key_type& k, Args&&... args) (etc.)

如果成功的话,这两种情况之间并没有真正的区别;操作顺序不同,但这不会以任何可预测的方式影响性能。 emplace 的代码大小仍会略大变体,因为它必须准备好在失败情况下执行更多工作。

关于c++ - 基本类型的 emplace 值得吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37595403/

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