安装std ::对

Dan*_*iel 22 c++ stl c++11

有没有办法安置std::pair

std::unordered_map<int, std::pair<std::string, std::string>> my_map;
my_map.emplace(1, "foo", "bar"); // Error
Run Code Online (Sandbox Code Playgroud)

当然可以插入:

my_map[2] = std::make_pair("bar", "foo");
Run Code Online (Sandbox Code Playgroud)

但是这不需要不必要的复制/移动吗?

Mik*_*our 23

有没有办法安置std :: pair?

参数需要适合pair<int, pair<string,string>>地图的构造函数value_type:

my_map.emplace(1, std::make_pair("foo", "bar"));
Run Code Online (Sandbox Code Playgroud)

但是这不需要不必要的复制/移动吗?

没有; make_pair生成一对指向字符串文字的指针,然后用于初始化(在情况下emplace)或分配给(在这种情况下[])地图中包含的字符串.

  • 扩展它 - "emplace"不会创建一个对象,然后将其移动到容器中; 它使用*forwarding*将参数转发给容器,然后容器在容器找到它想要构造对象的内存中时调用对象构造函数.(误导性的功能名称!) (2认同)

Yak*_*ont 19

在这种情况下,放置"值类型"的部分几乎没有意义std::pair,因为std::string它们都可以从C字符串有效地转换,并且可以有效地移动到地图中.简单m.emplace( 3, std::make_pair( "bob", "alice" ) )而且你达到最佳效率的99%.

但是,如果有一个std::map映射到该不能被有效地构成,即方式类型,C++ 11提供std::piecewise_construct用于std::pairemplace天.

struct A { }; // nothing
struct C { C(C&&)=delete; }; // no copy/move
struct B { B()=delete; B(B&&)=delete; B(C&&, C&&) {}; }; // no copy/move, only annoying ctor

std::map< int, std::pair<A,B> > test;
// test.emplace( 0, std::make_pair( A{}, B{} ); // does not compile
// test.emplace( 0, std::make_pair( A{}, B{C{},C{}} ); // does not compile
test.emplace( std::piecewise_construct,
  std::make_tuple(0),
  std::forward_as_tuple(
    std::piecewise_construct,
    std::forward_as_tuple(A{}),
    std::forward_as_tuple( C{}, C{} )
  )
); // compiles!
Run Code Online (Sandbox Code Playgroud)

实例

这是一个极端的角落情况,因为高效移动的物体更为常见.

  • 呃.`std :: piecewise_construct`是C++ 11,而不是C++ 14. (4认同)