将字符串的 std::p air 放置到无序列图中,重用字符串的堆

  • 本文关键字:字符串 std air 无序 c++ emplace
  • 更新时间 :
  • 英文 :


我有一个字符串对的无序映射,我通过消息id(键(引用它。现在,我想使用函数接收的临时字符串对象来构建字符串对,从而重用堆上已经为字符串分配的内存。但我很难理解这个建筑。以下是我的想法:

std::unordered_map<int, std::pair<std::string, std::string>> data_map;
void foo(int msg_id, std::string&& topic, std::string&& data)
{
data_map.emplace(std::piecewise_construct, std::forward_as_tuple(msg_id), std::forward_as_tuple(std::piecewise_construct, std::forward_as_tuple(topic), std::forward_as_tuple(data)));
}

我的推理是,我需要为包含键和值的映射构建第一对,其中的值必须由另一个分段对构造函数创建,我将r值refs提供给该构造函数。它编译了,但我的直觉告诉我有些问题。我能像这样重用字符串的已分配堆内存吗?

您的构造没有使用move构造函数来构造新字符串,因此它没有重用分配。

变量的名称总是左值。因此,std::forward_as_tuple将转发topicdata作为左值引用,从而导致对字符串使用复制构造函数。

要传递右值,需要std::move。此外,由于std::pair有一个构造函数,它为两个对元素接受两个参数,这正是您已经拥有的两个字符串,因此您不需要第二个分段构造:

data_map.emplace(std::piecewise_construct, std::forward_as_tuple(msg_id), std::forward_as_tuple(std::move(topic), std::move(data)));

最新更新