两种嵌入方式:
std::unordered_map<std::string, std::string> m;
首先:emplace移动键和值。
// 1.
{
std::string k1 = "key1";
std::string v1 = "value1";
m.emplace(std::move(k1), std::move(v1));
}
第二点:使用由
std::make_pair
创建的pair进行emplace操作:// 2.
{
std::string k2 = "key2";
std::string v2 = "value2";
m.emplace(std::make_pair(k2, v2));
}
哪个更好(指更快速高效)?
m.insert(std::make_pair(k2, v2));
,因为insert
被重载以接受右值引用。 - Chris Drewk1
和k2
无效。在std::move
之后,您不应该依赖它们的值。第二个将始终使它们有效,因为它们是左值,并且std::make_pair
的参数类型将解析为std::string&
。原因是std::make_pair
接受所谓的通用引用,即在类型推导上下文中的右值引用。 - Sergeyk1
和v1
是否被移动是一个分散注意力的问题,而本来这是一个很好的问题。在两种情况下,您都可以选择移动或不移动字符串(并且使用SSO对性能影响很小)。我认为将同类进行比较会更清晰明了。 - Chris Drew