安装std ::对

时间:2014-09-10 13:27:35

标签: c++ c++11 stl

有没有办法安置std::pair

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

当然可以插入:

my_map[2] = std::make_pair("bar", "foo");

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

4 个答案:

答案 0 :(得分:22)

  

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

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

my_map.emplace(1, std::make_pair("foo", "bar"));
  

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

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

答案 1 :(得分:19)

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

但是,如果您有std::map映射到无法以这种方式有效构造的类型,则C ++ 11为std::piecewise_construct提供std::pairemplace d。

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!

live example

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

答案 2 :(得分:0)

是的,有:

my_map.emplace(1, std::make_pair("foo", "bar"));

答案 3 :(得分:0)

对于C ++ 17,您可以使用try_emplace

std::unordered_map<int, std::pair<std::string, std::string>> my_map;
my_map.try_emplace(1, "foo", "bar");