我可以创建string和atomic <int>键值对的unordered_map吗?

时间:2017-09-04 01:47:01

标签: c++ c++11 atomic unordered-map

我想创建一个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的赋值运算符?有没有办法做到这一点?

1 个答案:

答案 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 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);