Как map :: lower_bound () и map :: upper_bound работают в C ++? - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь ознакомиться с картами в C ++, а также пытаюсь понять некоторые основные операции, которые можно использовать на них.Однако я не понимаю только двух: lower_bound() и upper_bound().Я смотрел их несколько раз, но не понимаю, что они делают.Может кто-нибудь уточнить, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Чтобы понять lower_bound / upper_bound, вы должны помнить, что map - это не просто контейнер, который отображает ключи на значения, но, как и в реальном словаре, он также обеспечивает сортировку элементов поключ, так что вы можете быть заинтересованы не только в поиске определенного элемента, но и в быстром нахождении «окружения» некоторого ключа, который может фактически не присутствовать.

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

Другой пример: у вас есть карта от отметки времени до событий, и вы хотите посмотреть вверхчто произошло между двумя метками времени.Вы можете использовать lower_bound, чтобы найти первый элемент >=, чем начальная временная метка, даже если такая временная метка на самом деле не соответствует ни одному сохраненному событию (поэтому find не будет), а затем идти вперед до тех пор, покавы находитесь в диапазоне ваших интересов.

Подобные примеры можно сделать с upper_bound - хотя, честно говоря, я думаю, что я использую его гораздо реже.

0 голосов
/ 21 сентября 2018

Нижнюю границу и верхнюю границу, вероятно, легче понять, так как equal_range.

equal_range возвращает пару итераторов, которые, если рассматривать их как полуоткрытый интервал, являются эквивалентными значениями (в <) к ключу, который вы ввели.

Как только вы поймете это, lower_bound вернет первый «начальный» итератор equal_range, а upper_bound вернет последний «один за концом»конечный итератор equal_range.

. Задание их напрямую приводит к неловкому прочтению, которое вы, вероятно, смущаете: «первый элемент не меньше чем» и т. д. Никто в здравом уме не думает о них таким образом, кроме как вузкие обстоятельства.

...