在unordered_map中增加int?

时间:2018-02-17 18:23:23

标签: c++ c++11

int c = counts.at(v).at(id);
std::cout << c;
counts.at(v).emplace(id,c+1);
std::cout << counts.at(v).at(id);

counts是unordered_map的unordered_map。第一个cout打印1,第二个打印1,为什么它没有增加?

2 个答案:

答案 0 :(得分:3)

如果该密钥已存在,

emplace不会插入任何内容,因此您可以使用以下

counts.at(v)[id] += 1;

operator[]将默认构造一个值(如果该键不存在),或者如果它存在则返回可修改的引用

答案 1 :(得分:1)

您已经找到了如何找到相关元素:

counts.at(v).at(id);

documentation,这是一个引用(直到你将它复制到一个新对象,如c),所以你可以简单地递增它:

counts.at(v).at(id)++;

或者,如果我们假设两个密钥已经存在(或者如果他们不存在则不介意创建它们),就像在代码中一样:

counts[v][id]++;

......在我看来,这更容易阅读。

emplace函数用于创建以前不存在的新元素。

总体而言:

std::cout << counts[v][id] << ' ';
counts[v][id]++;
std::cout << counts[v][id];

或者,如果您不想重复查找:

auto& elm = counts[v][id];
std::cout << elm << ' ';
elm++;
std::cout << elm;

你甚至可以进一步缩短它(虽然这不太清楚):

auto& elm = counts[v][id];
std::cout << elm++ << ' ';
std::cout << elm;

或者,since C++17

auto& elm = counts[v][id];
std::cout << elm++ << ' ' << elm;