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

Posted

技术标签:

【中文标题】我们如何在 C++ 中的无序映射中分配变量并更新它们?【英文标题】:How do we assign variables and update them in unordered maps in C++? 【发布时间】:2021-02-20 08:12:03 【问题描述】:

我正在尝试实现文本中字符的概率分布。我正在尝试学习无序地图,但在插入配对后我无法更新概率图。假设我们分配了字母“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));
    

【问题讨论】:

probs.at('a')++; 【参考方案1】:

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

因为如果ch 不匹配容器中任何元素的键,[] 操作符会插入一个带有该键的新元素(使用其默认构造函数构造)并返回对其映射值的引用。

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;

【讨论】:

【参考方案2】:

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

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

如果使用unordered_map,循环代码其实是一样的,但是上面的效率更高。

【讨论】:

以上是关于我们如何在 C++ 中的无序映射中分配变量并更新它们?的主要内容,如果未能解决你的问题,请参考以下文章

c ++为几个无序映射运行循环

如何将字符串添加到 C++ 中无序映射中的字符串向量

使用无序映射与数组搜索

我们如何在门控签入期间获取搁置集名称并将其分配给 tfs 构建任务中的变量

如何在构造函数中访问类变量以在不使用 C++ 中的 this 指针的情况下分配它们

遍历无序映射 C++