Эффективный способ итерации по каждому ключу ровно один раз в 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()
;
}