【发布时间】:2015-03-13 15:54:25
【问题描述】:
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
【问题讨论】:
-
@Cheersandhth.-Alf,我已经阅读了一堆文件,得出的结论是这是不可能的。但是,我不是最有经验的 C++ 开发人员,所以想通过这里的一些大师来运行它,希望我错了。你能帮忙吗?
-
您是指额外副本吗?
val是一个左值,因此必须在某个时候进行复制。 -
@juanchopanza,想象一下这个值是一些更复杂的类型,它既不可复制也不可移动(因此当然不能作为左值引入,也不能移动/转换为右值引用)。我想将值的构造函数参数直接提供给某种
emplace函数,以便使用完美转发和(可能)在地图中放置 new 来实例化它。 -
我在 youtube 上又找到了:youtube.com/watch?v=smqT9Io_bKo#t=46m00s
标签: c++ c++11 dictionary stl emplace