【问题标题】:std::unordered_map and duplicate keysstd::unordered_map 和重复键
【发布时间】:2011-12-28 20:46:27
【问题描述】:

我正在使用 stl unordered_map,但我似乎无法让 count 方法工作。 这是我的程序:

typedef unordered_map<char, int> Mymap;
int main() 
{
    Mymap m;  

    m.insert(Mymap::value_type('a', 1)); 
    m.insert(Mymap::value_type('b', 2)); 
    m.insert(Mymap::value_type('c', 3)); 
    m.insert(Mymap::value_type('b', 4)); 
    m.insert(Mymap::value_type('b', 5)); 

    cout << m.count('b') << endl;

    return 0; 
} 

unordered_map 的文档说unordered_map::count(const Key&amp; k) 返回键为k 的元素的数量。 所以我希望这里的输出是3,而真正的输出是1。为什么?

【问题讨论】:

    标签: c++ stl c++11 unordered-map


    【解决方案1】:

    unordered_map 维护键到值的 1:1 映射,因此 count 将始终返回零或一。

    如果要将多个值映射到单个键,则需要 unordered_multimap

    【讨论】:

    • 这很奇怪。那为什么会有这个功能呢?如果你用它来检查map中是否存在key,为什么不直接使用传统方式find(...) != end()
    • 确实 - count() 这个名字具有误导性。 exists() 会更好。
    • count() 是所有关联容器接口的一部分。
    • @Paul Manta: mapunique associative container 所以 m.count() 返回 0 或 1。但是对于一般的关联容器,例如 multiset、multimap,它可以返回大于 1 的值。
    【解决方案2】:
    // g++ -std=c++0x init-unorderedmap.cc && ./a.out
    #include <iostream>
    #include <unordered_map>
    
    namespace {
      typedef std::unordered_map<char, int> Mymap;
    }
    
    int main() {
      using namespace std;
    
      Mymap m{ {'a', 1}, {'b', 2}, {'c', 3}, {'b', 4}, {'b', 5}};
      cout << m.count('b') << endl;
    
      unordered_multimap<char, int> mm{ {'b', 4}, {'b', 5}};
      cout << mm.count('b') << endl;
    }
    

    输出

    1
    2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 2013-11-05
      相关资源
      最近更新 更多