我可以创建一个 unordered_map 字符串和原子 <int> 键值对吗?

Can I create an unordered_map of string and atomic<int> key-value pairs?

我想创建 <string, atomic<int>>unordered_map。我会用它来递增 (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;

这应该打印出 wanted 中键的值。

我可以这样做吗?如果我尝试按上述方式创建映射,我会收到错误消息,指出原子的赋值运算符已被删除?有办法吗?

当然,创建一个 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);

如果您的 key/value 类型构造函数采用多个参数,为避免复制和移动,您必须使用 std::pair's 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);