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

Mar*_*ark 5 c++ unordered-map atomic c++11

我想创建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"}
};
Run Code Online (Sandbox Code Playgroud)

然后说我有一个字符串向量,例如

vector<string> wanted = {"first", "third", "tenth"};
Run Code Online (Sandbox Code Playgroud)

我想做以下事情:

for (auto want: wanted) {
    cout <<  myValues[want].load() << endl;
Run Code Online (Sandbox Code Playgroud)

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

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

Pra*_*ian 8

当然,创建 anunordered_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);
Run Code Online (Sandbox Code Playgroud)

如果您的键/值类型构造函数采用多个参数,为了避免复制和移动,您必须使用 的std::pair分段构造构造函数emplace成员函数。

for(auto const& key : {"first", "second", "third", "fourth"})
    m.emplace(std::piecewise_construct,
              std::forward_as_tuple(key),
              std::forward_as_tuple(0));
Run Code Online (Sandbox Code Playgroud)

如果您的编译器支持 C++17,并且可以使用单个参数构造键类型,那么您还可以使用不太详细的try_emplace成员函数

for(auto const& key : {"fifth", "sixth", "seventh", "eight"})
    m.try_emplace(key, 0);
Run Code Online (Sandbox Code Playgroud)