std::unordered_map和重复键

14

我正在使用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::count(const Key& k)返回键为k的元素数量。因此我期望这里的输出应该是3,但实际输出为1。为什么?
2个回答

38

unordered_map维护了一个键到值的一对一映射,因此count始终返回零或一。

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


2
很奇怪,那个函数存在的意义是什么?如果你用它来检查一个键是否存在于映射中,为什么不直接使用传统的方式,即 find(...) != end() - Paul Manta
1
实际上,“count()”这个名称是具有误导性的。“exists()”会更好。 - Bee San
17
count()是所有关联式容器的接口之一。 - James McNellis
2
@Paul Manta:map是一种独特的关联容器,因此m.count()只会返回0或1。但对于一般的关联容器,如multiset、multimap等,它可以返回大于1的值。 - jfs

14
// 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接