Чтобы понять lower_bound
/ upper_bound
, вы должны помнить, что map
- это не просто контейнер, который отображает ключи на значения, но, как и в реальном словаре, он также обеспечивает сортировку элементов поключ, так что вы можете быть заинтересованы не только в поиске определенного элемента, но и в быстром нахождении «окружения» некоторого ключа, который может фактически не присутствовать.
Представьте, что у вас есть map<string, T>
, который отображает слова из словаря в другое.Если вы хотите сопоставить префикс (скажем, все слова, начинающиеся с «dange»), используйте lower_bound
, который вернет вам первый элемент, больший или равный данному значению;все слова, начинающиеся с этого префикса, сравниваемые лексикографически, будут удовлетворять этому критерию (поэтому вы можете получить итератор, указывающий на «опасность»).Теперь вы можете выполнять итерацию вперед до тех пор, пока префикс совпадает («опасность», «опасный», ...).
Другой пример: у вас есть карта от отметки времени до событий, и вы хотите посмотреть вверхчто произошло между двумя метками времени.Вы можете использовать lower_bound
, чтобы найти первый элемент >=
, чем начальная временная метка, даже если такая временная метка на самом деле не соответствует ни одному сохраненному событию (поэтому find
не будет), а затем идти вперед до тех пор, покавы находитесь в диапазоне ваших интересов.
Подобные примеры можно сделать с upper_bound
- хотя, честно говоря, я думаю, что я использую его гораздо реже.