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,为什么它没有增加?
答案 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;