我可以创建一个字符串和原子键值对的unordered_map吗?
我想创建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的赋值运算符已被删除?有没有办法做到这一点?
当然,创造一个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
的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);
美丽,谢谢,修复它。 – Mark
为什么'try_emplace'? 'm.emplace(key,0);'很好(没有C++ 17的支持) – LWimsey
@LWimsey嗯,不是很傻吗?显然是一个超越它的例子。现在修复。 – Praetorian
'atomic'类型既不可复制也不可移动 – LWimsey
那么这意味着我的方法是DOA?有没有不同的方式来完成同样的事情? – Mark
而不是试图复制'原子'值(不,不!)你可以单独定义初始化数据,只是循环它和['emplace'](http://en.cppreference.com/w/cpp/container/ unordered_map/emplace)它在你的地图。 –