Разве мы не можем найти ключ "ближайшего совпадения", используя эти методы?
Нет. hash_multimap
реализовано с использованием хеш-таблицы. Два ключа, которые очень близки друг к другу (например, 0,2153 и 0,2175), вероятно, будут отображаться в совершенно разные ячейки в хеш-таблице.
Хеш-таблица не поддерживает свои элементы в отсортированном порядке, поэтому без линейного поиска невозможно найти наиболее близкое совпадение с данным ключом.
Функции lower_bound
, upper_bound
и equal_range
в hash_multimap
имеют несколько странную реализацию в расширениях стандартной библиотеки Visual C ++.
Рассмотрим документацию для lower_bound
:
Функция-член определяет первый элемент X
в контролируемой последовательности, который хэшируется в тот же сегмент, что и ключ, и имеет эквивалентный порядок для ключа. Если такого элемента не существует, он возвращает hash_map::end
; в противном случае он возвращает итератор, который обозначает X
. Вы используете его, чтобы найти начало последовательности элементов, находящихся в данный момент в контролируемой последовательности, которые соответствуют указанному ключу.
и документация для upper_bound
:
Функция-член определяет последний элемент X
в контролируемой последовательности, который хэшируется в тот же сегмент, что и ключ, и имеет эквивалентный порядок для ключа. Если такого элемента не существует или X
является последним элементом в контролируемой последовательности, возвращается hash_map::end
; в противном случае он возвращает итератор, который обозначает первый элемент за X
. Вы используете его, чтобы найти конец последовательности элементов, находящихся в данный момент в контролируемой последовательности, которые соответствуют указанному ключу.
По сути, эти функции позволяют вам определить диапазон элементов, которые имеют данный ключ. Их поведение не совпадает с поведением std::lower_bound
или std::map::lower_bound
(их поведение, которое вы ожидали).
Для чего не стоит, неупорядоченные ассоциативные контейнеры C ++ 0x не предоставляют функций lower_bound
, upper_bound
или equal_range
.
Не могли бы вы подсказать, что я могу использовать для моего требования?
Да: если вам нужно поведение lower_bound
и upper_bound
, используйте упорядоченный ассоциативный контейнер, такой как std::multimap
.