Эффективный способ итерации по каждому ключу ровно один раз в unordered_multimap

У меня есть std::unordered_multimap и я хочу повторить каждый ключ ровно один раз.

Сейчас я копирую все ключи в std::set. Мне это кажется довольно неэффективным, и мне интересно, есть ли более разумный способ сделать это. Если бы это былstd::multiset Я бы использовал std::multiset::upper_bound() член для доступа к следующему ключу, но этот член, очевидно, недоступен в неупорядоченной версии.

Я нашел несколько связанных вопросов и ответов, но они кажутся устаревшими / слишком сложными для моей цели.

Так есть ли хороший способ перебора разных ключей? Я все еще учусь, поэтому я буду очень признателен за указание меня в правильном направлении! Спасибо.

1 ответ

[...] элементы с эквивалентными ключами соседствуют друг с другом в порядке итерации контейнера.

Источник, или вы можете считать, что это гарантируется существованиемequal_range. Обратите внимание, что "эквивалент" находится подKeyEqual т.е. это означает == если по умолчанию std::equal_to<Key> указан.

Таким образом, итерация по элементам без элементов с одинаковыми ключами будет работать:

for (auto it = c.begin(); it != c.end(); ) {
    auto const& key = it->first;
    std::cout << key << std::endl;
    while (++it != c.end() && it->first == key) // or c.key_eq()
        ;
}
Другие вопросы по тегам