unordered_map 放置默认构造函数
unordered_map emplace with default constructor
我有unordered_map,键值对类型分别是string和aClass;不能移动 aClass 的地方(它有一个互斥量)。我也不希望它是复制构造的;我认为复制构造一个包含互斥锁的 class 是不明智的。
为了延迟项目的构建直到它插入到地图中,我尝试使用 emplace 将它插入到地图中,因此,第二个参数必须为空:
aList.emplace("aString");
但是,上一行没有用。
任何想法如何使用默认构造函数来放置?
我也试过:
aList.emplace("aString", void);
aList.emplace("aString", {});
aList.emplace(std::piecewise_construct,"aString");
谢谢,
一种解决方案是使用 std::unordered_map<>::operator[]
,它使用默认构造函数创建新元素:
auto& element = m["aString"]; // Creates a new element or gets an existing one.
或者,如果不需要 return 值:
static_cast<void>(m["aString"]);
如果您可以访问 C++17,则可以使用 try_emplace
:
myMap.try_emplace("someKey");
这将默认构造一个具有键 "someKey" 的新元素。
在 C++17 之前,您可以使用 emplace
使用 std::pair
的 std::piecewise_construct
构造函数和一个空元组作为值的参数:
myMap.emplace(std::piecewise_construct,
std::forward_as_tuple("someKey"),
std::tuple<>{});
我有unordered_map,键值对类型分别是string和aClass;不能移动 aClass 的地方(它有一个互斥量)。我也不希望它是复制构造的;我认为复制构造一个包含互斥锁的 class 是不明智的。 为了延迟项目的构建直到它插入到地图中,我尝试使用 emplace 将它插入到地图中,因此,第二个参数必须为空:
aList.emplace("aString");
但是,上一行没有用。 任何想法如何使用默认构造函数来放置? 我也试过:
aList.emplace("aString", void);
aList.emplace("aString", {});
aList.emplace(std::piecewise_construct,"aString");
谢谢,
一种解决方案是使用 std::unordered_map<>::operator[]
,它使用默认构造函数创建新元素:
auto& element = m["aString"]; // Creates a new element or gets an existing one.
或者,如果不需要 return 值:
static_cast<void>(m["aString"]);
如果您可以访问 C++17,则可以使用 try_emplace
:
myMap.try_emplace("someKey");
这将默认构造一个具有键 "someKey" 的新元素。
在 C++17 之前,您可以使用 emplace
使用 std::pair
的 std::piecewise_construct
构造函数和一个空元组作为值的参数:
myMap.emplace(std::piecewise_construct,
std::forward_as_tuple("someKey"),
std::tuple<>{});