c++ - std::map 没有复制值

标签 c++ c++11 dictionary stl emplace

C++11 std::map<K,V>类型有 emplace功能,就像许多其他容器一样。

std::map<int,std::string> m;

std::string val {"hello"};

m.emplace(1, val);

此代码如宣传的那样工作,取代了 std::pair<K,V>直接,但是它会生成 key 的拷贝和 val发生。

是否也可以将值类型直接放入映射中?我们能比将调用中的参数移动到 emplace 做得更好吗? ?


这里有一个更详尽的例子:

struct Foo
{
   Foo(double d, string s) {}
   Foo(const Foo&) = delete;
   Foo(Foo&&) = delete;
}

map<int,Foo> m;
m.emplace(1, 2.3, string("hello")); // invalid

最佳答案

您传递给 map::emplace 的参数转发给 map::value_type 的构造函数,即 pair<const Key, Value> .所以你可以使用 piecewise construction constructorstd::pair避免中间复制和移动。

std::map<int, Foo> m;

m.emplace(std::piecewise_construct,
          std::forward_as_tuple(1),
          std::forward_as_tuple(2.3, "hello"));

Live demo

关于c++ - std::map 没有复制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27960325/

相关文章:

c++ - 如何借助指针按数组元素的余弦对数组进行升序排序?

Python检查字典是否是其他字典的一部分

c++ - 创建索引有序映射

Xcode/AppCode 中的 IOS Swift 调试 - 我无法查看我的字典内容

java - 有没有办法使用 C++ 从 Java 进程中读取值?

c++ - 未知类型 C++

c++ - 将迭代器存储到字符串中(转换、转换、追加?)

c++ - 如何在一行中通过指针构造一个点?

c++ - constexpr 是否暗示内联?

c++ - 编译器无法对用作条件的表达式应用显式转换