两种放置方式:
std::unordered_map<std::string, std::string> m;
首先:放置移动的键和值
// 1.
{
std::string k1 = "key1";
std::string v1 = "value1";
m.emplace(std::move(k1), std::move(v1));
}
第二个:用 pair 放置我的 std::make_pair
:
// 2.
{
std::string k2 = "key2";
std::string v2 = "value2";
m.emplace(std::make_pair(k2, v2));
}
哪个更好(意味着速度效率更高)?
最佳答案
Which is better?
如何更好?它们不等同。
示例 1 为 k1
和 v1
调用移动构造函数,使它们处于有效但不同的状态,它们的内容将被移走。如果您打算之后使用 k1
或 v1
则别无选择,您应该使用 #2。如果你不这样做,那么你也应该移动到 #2 以避免复制:
m.emplace(std::make_pair(std::move(k2), std::move(v2)));
然后将其留给可读性:
m.emplace(std::move(k1), std::move(k2));
这调用 std::pair
的模板构造函数从 2 个右值引用构造一个 std::pair
。
对比
m.emplace(std::make_pair(std::move(k2), std::move(v2)));
这会调用 std::pair
的移动构造函数,因为它是一个右值。
如果“哪个更好?”是指性能,那么只有一种方法可以找出答案,即基准测试。虽然我认为 m.emplace(std::move(k1), std::move(k2));
有一点优势。 (如评论中所述,因为它避免了从非常量到常量的转换)
要点,别着急,它们都非常高效,因为它们都在移动。选择您认为更具可读性的那个。
关于c++ - emplace(std::move(key), std::move(value)) vs emplace(std::make_pair(key, value)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40841174/