我们如何在 C++ 中的无序映射中分配变量并更新它们?

How do we assign variables and update them in unordered maps in C++?

我正在尝试实现文本中字符的概率分布。我正在尝试学习无序映射,但在插入对后我无法更新概率映射。假设我们分配了字母 'a'、'b' 和 'c',我想增加地图中 'a' 的值。有什么建议吗?

string text = "abcaa";
unordered_map<char, int> probs;
int i = 0;
//Initialize the probability map.
for (char& ch : text) {
    if (probs.find(ch) != probs.end()) //if ch not in probs, create a pair.
    {
        probs.insert(make_pair(ch, 1));
    }
}

因为 char 只有 256 个可能的值,更好的方法是:

std::array<int, 256> probs;
probs.fill(0);
for (char ch : text)
    ++probs[ch];

如果使用unordered_map,循环代码实际上是相同的,但上面的效率更高。

你可以马上写 probs[ch]++

因为如果 ch 不匹配容器中任何元素的键,[] 运算符将使用该键插入一个新元素(使用其默认构造函数构造)并且 returns 对其映射值的引用。

int main() {
    std::string text = "abcaa";
    std::unordered_map<char, int> probs;
    int i = 0;

    for (char& ch : text)
        probs[ch]++;

    for (auto& it: probs)
        std::cout << it.first << " " << it.second << std::endl;
}