gpt4 book ai didi

c++ - 调用 std::map::emplace() 并避免不必要的构造

转载 作者:太空宇宙 更新时间:2023-11-04 11:42:30 28 4
gpt4 key购买 nike

我有一个std::map,它的键是std::string,值是我自己定义的类型。

假设我有以下代码:

std::map<std::string, MyType> mymap;
std::string str1("test");
MyType value(pars); //I want value to be moved

mymap.emplace(std::make_pair(str1, std::move(value))); //A
mymap.emplace(str, std::move(value)); //B

假设 std::map 存储对,我猜 A 会生成对 std::pair 构造函数 (make_pair) 的进一步调用,随后调用 std::pair 移动构造函数(使用右值参数的就地构造)。

而且我认为 B 只会生成对 std::pair 构造函数的调用。

那么我们可以说 B 优于 A 以避免不必要的构造吗?

最佳答案

根据 http://www.cplusplus.com/reference/map/map/emplace/ :

Inserts a new element in the map if its key is unique. This new element is constructed in place using args as the arguments for the construction of a value_type (which is an object of a pair type) ... The element is constructed in-place by calling allocator_traits::construct with args forwarded.

所以在选项 A 中,您首先构造一个对,emplace 将转发给 pair 的构造函数(作为右值),然后构造一个移动构造。

选项 B 将 strstd::move(value) 的返回转发给 pair 的构造函数。

所以是的,选项 A 构造了 2 个对,而选项 B 只构造了 1 个。

关于c++ - 调用 std::map::emplace() 并避免不必要的构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20830349/

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