std::unordered_map и повторяющиеся ключи

Я использую stl unordered_map и не могу заставить работать метод подсчета. Это моя программа:

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& k) возвращает количество элементов с ключом k. Поэтому я ожидаю, что вывод здесь будет 3, тогда как реальный вывод - 1. Почему?


person Bee San    schedule 14.11.2011    source источник


Ответы (2)


unordered_map поддерживает сопоставление ключа со значением 1:1, поэтому count всегда будет возвращать ноль или единицу.

Вам нужен unordered_multimap, если вы хотите сопоставить несколько значений с одним ключом.

person James McNellis    schedule 14.11.2011
comment
Это странно. Почему тогда существует эта функция? Если вы используете его для проверки наличия ключа на карте, почему бы просто не использовать традиционный способ, find(...) != end()? - person Paul Manta; 14.11.2011
comment
Действительно - имя count() вводит в заблуждение. exists() было бы лучше. - person Bee San; 14.11.2011
comment
count() является частью интерфейса для всех ассоциативных контейнеров. - person James McNellis; 14.11.2011
comment
@Paul Manta: map – это уникальный ассоциативный контейнер, поэтому m.count() возвращает либо 0, либо 1. Но для ассоциативного контейнера в целом, такого как мультимножество, мультимап, он может возвращать значения больше 1. - person jfs; 14.11.2011

// 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
person jfs    schedule 14.11.2011