std :: unordered_map和重复键

Bee*_*San 8 c++ stl unordered-map c++11

我正在使用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; 
} 
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*lis 29

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

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

  • `count()`是所有关联容器的接口的一部分. (15认同)
  • 那很奇怪.为什么这个功能存在呢?如果你用它来检查地图中是否存在某个键,为什么不使用传统方式,`find(...)!= end()`? (2认同)
  • @Paul Manta:`map`是一个[唯一的关联容器](http://www.sgi.com/tech/stl/UniqueAssociativeContainer.html)所以`m.count()`返回0或1.但是对于关联容器一般如multiset,multimap它可以返回大于1的值. (2认同)

jfs*_*jfs 12

// 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;
}
Run Code Online (Sandbox Code Playgroud)

产量

1
2
Run Code Online (Sandbox Code Playgroud)