c++ - emplace(std::move(key), std::move(value)) vs emplace(std::make_pair(key, value))

标签 c++

两种放置方式:

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 为 k1v1 调用移动构造函数,使它们处于有效但不同的状态,它们的内容将被移走。如果您打算之后使用 k1v1 则别无选择,您应该使用 #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/

相关文章:

c++ - 如何在 OpenGL 3.3 中实现 3d 纹理

c++ - typedef 在c++中别人的.h头文件中声明的函数

C++ 链接第 3 方 header 和源代码

c++ - 在特定索引c++/Qt的另一个字符串中插入字符串

c++ - 如何将 std::getline 转换为模板类型?

c++ - 如何获取指向 std::get<0,tuple<int,int>> 的指针?

c++ - 绘制后在自定义小部件上绘制

c++ - 双重继承和多态性。如何从一个基类中分离出两个成员?

c++ - 现代 C++ 在多大程度上消除了对设计模式的需求?

c++ - 从 Bash 将输入通过管道传递给 C++ cin