我想创建一个unordered_map
<string, atomic<int>>
。我会使用它来递增(fetch_add),根据字符串(键)存储或加载原子的值。例如,假设我有10个原子整数计数器,但我想只得到4或它们的值。我希望unordered_map
看起来像这样:
unordered_map<string, atomic<int>> myValues = {
{"first", atomic<int>(0)},
{"second", atomic<int>(0)}, ... the last key being "tenth"}
};
然后说我有一个像
这样的字符串向量vector<string> wanted = {"first", "third", "tenth"};
我想做以下事情:
for (auto want: wanted) {
cout << myValues[want].load() << endl;
这应打印出所需密钥的值。
我可以这样做吗?如果我尝试创建如上所示的映射,我会收到错误消息,即删除了atomic的赋值运算符?有没有办法做到这一点?
答案 0 :(得分:3)
当然,可以创建unordered_map<string, atomic<int>>
,但无法使用initializer_list
构造函数初始化它,因为atomic<T>
对象既不可移动也不可复制。
由于地图中的值可以使用单个参数构建,因此您可以使用emplace
成员函数。
std::unordered_map<std::string, std::atomic<int>> m;
for(auto const& key : {"first", "second", "third", "fourth"})
m.emplace(key, 0);
如果您的键/值类型构造函数需要多个参数,为了避免复制和移动,您必须使用std::pair
&#39; piecewise construction constructor和emplace
成员函数。
for(auto const& key : {"first", "second", "third", "fourth"})
m.emplace(std::piecewise_construct,
std::forward_as_tuple(key),
std::forward_as_tuple(0));
如果您的编译器支持C ++ 17,并且可以使用单个参数构造密钥类型,那么您还可以使用较不详细的try_emplace
成员函数
for(auto const& key : {"fifth", "sixth", "seventh", "eight"})
m.try_emplace(key, 0);