2017-09-04 41 views
2

我想创建unordered_map<string, atomic<int>>。我会用它来增加(fetch_add),存储或加载基于字符串(键)的原子值。例如,假设我有10个原子的整数计数器,但我只想得到4或者它们的值。我想一个unordered_map看起来像这样:我可以创建一个字符串和原子<int>键值对的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的赋值运算符已被删除?有没有办法做到这一点?

+1

'atomic'类型既不可复制也不可移动 – LWimsey

+0

那么这意味着我的方法是DOA?有没有不同的方式来完成同样的事情? – Mark

+1

而不是试图复制'原子'值(不,不!)你可以单独定义初始化数据,只是循环它和['emplace'](http://en.cppreference.com/w/cpp/container/ unordered_map/emplace)它在你的地图。 –

回答

1

当然,创造一个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::pairpiecewise construction constructoremplace成员函数。

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); 
+0

美丽,谢谢,修复它。 – Mark

+0

为什么'try_emplace'? 'm.emplace(key,0);'很好(没有C++ 17的支持) – LWimsey

+0

@LWimsey嗯,不是很傻吗?显然是一个超越它的例子。现在修复。 – Praetorian

相关问题