hash — c ++ hash_multimap как получить значения

Это, вероятно, действительно просто, но я не могу найти простой пример для этого.
Я понимаю, что с hash_multimap вы можете иметь несколько значений, сопоставленных одному ключу. Но как именно я получу доступ к этим ценностям. Все примеры, на которые я наткнулся, всегда просто обращаются к первому значению, сопоставленному с ключом. Вот пример того, что я имею в виду

key : value
1 : obj1a;
2 : obj2a, obj2b, obj2c

как бы я получил доступ к obj2b и obj2c, а не только к obj2a

0

Решение

Обычный многоэтапный итерационный цикл выглядит так:

#include <unordered_multimap>

typedef std::unordered_multimap<K, V> mmap_t;

mmap_t m;

for (mmap_t::const_iterator it1 = m.begin(), it2 = it1, end = m.end(); it1 != end; it1 = it2)
{
// outer loop over unique keys

for ( ; it1->first == it2->first; ++it2)
{
// inner loop, all keys equal to it1->first
}
}

Чтобы перебрать только одно значение ключа, используйте equal_range вместо.

std::pair<mmap_t::const_iterator, mmap_t::const_iterator> p = m.equal_range(key);

for (mmap_t::const_iterator it = p.first; it != p.second; ++it)
{
// use "it->second"}
3

Другие решения

Например, equal_range возвращает два итератора, в начало и конец соответствующего диапазона:

void lookup(const map_type& Map, int key)
{
cout << key << ": ";
pair<map_type::const_iterator, map_type::const_iterator> p =
Map.equal_range(key);

for (map_type::const_iterator i = p.first; i != p.second; ++i)
cout << (*i).second << " ";

cout << endl;
}

где мы используем map_type лайк

class ObjectT; // This is the type of object you want to store
typedef hash_multimap<int, ObjectT> map_type;
2

Просто возьмите итератор первого и увеличьте его. Если ключи все еще равны, у вас есть другая запись с тем же значением ключа. Вы также можете использовать equal_range.

0
По вопросам рекламы [email protected]