Найдите ближайшие ключи, существующие на границе диапазона `[x,y]` в std::map в C++

Мне нужно найти ближайшие ключи на моей карте в заданном диапазоне [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 в результате?

Это опечатка, что обе границы равны «3»?

User 10482 01.07.2024 18:04

@User10482 User10482 нет опечатки. [-3,3]

Gaurav K 01.07.2024 18:06

Можете ли вы опубликовать минимально воспроизводимый пример ? itCurrent и itNext являются итераторами пар, они не могут возвращать -2.

3CxEZiVlQ 01.07.2024 18:08

@3CxEZiVlQ Я отредактировал вопрос, чтобы сделать его более понятным iterator to Keys -2 and 2

Gaurav K 01.07.2024 18:11

Почему бы просто не использовать std::prev, когда вы получаете конечный итератор? Из этого можно сделать функцию. Также проверьте, что карта не пуста.

Nelfeal 01.07.2024 18:12
lower_bound возвращает первый элемент не меньше, чем его аргумент. upper_bound возвращает первый элемент, больший, чем его аргумент. Они не могут дать вам элемент, меньший, чем их аргумент.
Nelfeal 01.07.2024 18:13

@Nelfeal Я могу работать с подмножеством. Это всего лишь пример, карта могла бы быть намного больше.

Gaurav K 01.07.2024 18:14

Я не вижу проблемы. Используйте lower_bound, проверьте конечный итератор или пустую карту, а затем используйте std::prev.

Nelfeal 01.07.2024 18:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если я правильно понял вопрос, у вас есть карта 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;
}

Демо

Другие вопросы по теме