unordered_map放置默认构造函数

时间:2020-03-20 16:04:20

标签: c++ c++14 unordered-map emplace

我有unordered_map,其键值对分别为string和aClass类型; aClass不能移动的地方(它有一个互斥体)。我也不希望它被复制构造。我认为复制构造一个包含互斥量的类不是明智的。 为了将项目的构建延迟到插入地图之前,我尝试使用emplace将其插入地图,因此,第二个参数必须为空:

aList.emplace("aString");

但是,前一行无效。 有任何想法如何使用默认构造函数放置吗? 我也尝试过:

aList.emplace("aString", void);
aList.emplace("aString", {});
aList.emplace(std::piecewise_construct,"aString");

谢谢

2 个答案:

答案 0 :(得分:2)

一种解决方案是使用std::unordered_map<>::operator[],它使用默认构造函数创建新元素:

auto& element = m["aString"]; // Creates a new element or gets an existing one.

或者,如果不需要返回值:

static_cast<void>(m["aString"]);

答案 1 :(得分:2)

如果您有权使用C ++ 17,则可以使用try_emplace

myMap.try_emplace("someKey");

这将默认使用键“ someKey”构造一个新元素。

在C ++ 17之前,您可以使用std::pair的{​​{1}}构造函数和值为值参数的空元组来使用emplace

std::piecewise_construct