Мне нужно найти ближайшие ключи на моей карте в заданном диапазоне [x,y]
. Я пытаюсь ниже
std::map<int, char> m{ {-2,'B'}, {1, 'C'}, {2, 'A'}};
auto itCurrent = m.lower_bound(-3);
auto itNext = m.upper_bound(-3);
auto it1 = m.lower_bound(3);
auto it2 = m.upper_bound(3);
Я надеялся получить итераторы, указывающие на -2
и 2
, используя lower_bound
и uppper_bound
вокруг границы запроса keys [-3,3]
. it1
и it2
возвращают end
, а itCurrent
и itNext
возвращают итератор в key -2
.
Как мне получить iterators to -2 and 2
в результате?
@User10482 User10482 нет опечатки. [-3,3]
Можете ли вы опубликовать минимально воспроизводимый пример ? itCurrent
и itNext
являются итераторами пар, они не могут возвращать -2.
@3CxEZiVlQ Я отредактировал вопрос, чтобы сделать его более понятным iterator to Keys -2 and 2
Почему бы просто не использовать std::prev
, когда вы получаете конечный итератор? Из этого можно сделать функцию. Также проверьте, что карта не пуста.
lower_bound
возвращает первый элемент не меньше, чем его аргумент. upper_bound
возвращает первый элемент, больший, чем его аргумент. Они не могут дать вам элемент, меньший, чем их аргумент.
@Nelfeal Я могу работать с подмножеством. Это всего лишь пример, карта могла бы быть намного больше.
Я не вижу проблемы. Используйте lower_bound
, проверьте конечный итератор или пустую карту, а затем используйте std::prev
.
Если я правильно понял вопрос, у вас есть карта m
и два ключа x
и y
, и вам нужен первый элемент m
не меньше x
и последний элемент m
не больше y
.
Первое — это именно то, что lower_bound
дает вам. Это itCurrent
в вашем примере. Второе вы легко можете получить с помощью lower_bound
и std::advance
.
auto inverse_lower_bound(auto const& map, auto const& key) {
auto it = map.lower_bound(key);
if (it == map.end() && !map.empty()) {
std::advance(it, -1);
}
return it;
}
Это опечатка, что обе границы равны «3»?