首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >放置std::对

放置std::对
EN

Stack Overflow用户
提问于 2014-09-10 21:27:35
回答 3查看 14.4K关注 0票数 26

有没有一种嵌入std::pair的方法?

代码语言:javascript
复制
std::unordered_map<int, std::pair<std::string, std::string>> my_map;
my_map.emplace(1, "foo", "bar"); // Error

当然,插入是可能的:

代码语言:javascript
复制
my_map[2] = std::make_pair("bar", "foo");

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

EN

回答 3

Stack Overflow用户

发布于 2014-09-10 22:15:34

在这种情况下,替换“值类型”std::pair的部分几乎没有什么意义,因为std::string既可以有效地从C字符串转换,也可以有效地移动到映射中。简单的m.emplace( 3, std::make_pair( "bob", "alice" ) )就能让你达到最佳效率的99%。

但是,如果您有一个映射到不能以这种方式有效构造的类型的std::map,C++11会为std::pair提供emplaced的std::piecewise_construct

代码语言:javascript
复制
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

这是一个极端的情况,因为高效移动对象要常见得多。

票数 21
EN

Stack Overflow用户

发布于 2014-09-10 21:33:30

是的,有:

代码语言:javascript
复制
my_map.emplace(1, std::make_pair("foo", "bar"));
票数 1
EN

Stack Overflow用户

发布于 2020-06-19 11:28:36

对于C++17,您可以使用try_emplace来实现这一点:

代码语言:javascript
复制
std::unordered_map<int, std::pair<std::string, std::string>> my_map;
my_map.try_emplace(1, "foo", "bar");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25766730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档