Найдите диапазон ключей, который существует в «диапазоне запроса» в std::map в C++

Как узнать, есть ли у меня ключи в диапазоне . Я пытаюсь ниже:

Цель состоит в том, чтобы получить -2 and 2 как ключевой граничный диапазон (который фактически существует на карте) в пределах диапазона запроса [-3,3]

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 за itCurrent и itNext, но почему я получаю end за it1 и it2 оба. Я ожидал, что m.lower_bound(3) должен вернуться 2.

Под [-3, +3] вы имеете в виду закрытый интервал (включая оба предела)? Поскольку C, C++ и большинство родственных языков по умолчанию используют полуоткрытые интервалы, например. [-3, +3) с включенным -3 и без +3. См. границы массива, int a[5] имеет от a[0] до a[4], но не a[5].

MSalters 01.07.2024 17:41

Вероятно, то же коренное недоразумение, что и обоснование std::lower_bound и std::upper_bound? . Диаграмма в A: Разница между Upper_bound и Lower_bound в stl может помочь. (Должно ли это быть помечено как дубликат?)

JaMiT 01.07.2024 17:44

@MSalters Другими словами, мне нужно найти ближайшие существующие ключи в моем диапазоне (3,3) или [-3,3] . Итак, я хочу получить ключи -2 и 2 в том виде, в котором они существуют на карте и в моем диапазоне запроса.

Gaurav K 01.07.2024 17:51

@GauravK Я отменил ваше редактирование, потому что вы не должны редактировать вопрос таким образом, чтобы сделать существующие ответы недействительными. Пожалуйста, опубликуйте новый вопрос.

wohlstad 01.07.2024 17:55

Также если диапазон не содержит слишком много ключей, вы можете просто перебирать их и выбирать нужные по любому критерию.

wohlstad 01.07.2024 17:57

@GauravK: Я понимаю, что +2 и -2 определенно находятся в пределах этого диапазона. Но поскольку вы пишете «мой диапазон (3,3) или [-3,3]», я вынужден сделать вывод, что вы не уверены в открытии или закрытии, но вы определенно не имеете в виду полуоткрытый интервал [-3] , +3), что является обычным соглашением C++. Это объясняет, почему вы видите такое поведение: lower_bound и upper_bound возвращают здесь один и тот же тип полуоткрытого интервала.

MSalters 01.07.2024 18:02

@MSalters Я знаю разницу между [-3,3], (-3,3) или [-3,3). В моем конкретном примере это не имеет значения, поскольку ключи находятся в диапазоне [-2,2]. И поэтому сказал enquiry range (3,3) or [-3,3]

Gaurav K 01.07.2024 18:05

@GauravK: Программировать простые случаи легко. Правильно разобраться в крайних случаях сложно. И в данном случае речь идет о буквальном крае интервала. Если вы даже не можете определить, что должна делать ваша функция, как мы можем сказать вам, как ее реализовать? Кроме того, подумайте, что должна делать ваша функция, например, когда карта пуста — спецификация не может просто игнорировать это.

MSalters 01.07.2024 18:08
Стоит ли изучать 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
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Как вы можете видеть в документации std::map::lower_bound:

Возвращаемое значение

Итератор, указывающий на первый элемент, который не меньше ключа. Если такой элемент не найден, используется итератор прошедшего конца (см. end()). вернулся.

(выделено мной)

У вас нет ключа не меньше 3, поэтому m.lower_bound(3) возвращает end().

Аналогично с std::map::upper_bound:

Возвращаемое значение

Итератор, указывающий на первый элемент, который больше ключа. Если нет такой элемент найден, возвращается итератор прошлого конца (см. end()).

(выделено мной)

У вас нет ключа больше 3, поэтому m.upper_bound(3) возвращает end().

Это также имеет смысл для вашей цели поиска элементов в диапазоне:
Все ваши элементы находятся до конца диапазона (и включены в него) — именно это и означает возвращаемое значение end().
Для закрытого диапазона, такого как [-3,3], все элементы от m.lower_bound(-3) до m.upper_bound(3) (но не включая) находятся в диапазоне.
Если вам нужны те, которые ближе всего к границам диапазона, это:
auto it_low = m.lower_bound(-3); и
auto it_high = m.upper_bound(3); std::advance(it_high , -1);
(std::advance с -1 используется для получения одного элемента перед итератором, который находится сразу после диапазона).

Как найти ближайшие клавиши в диапазоне [-3,3]? Есть ли простой способ.

Gaurav K 01.07.2024 17:42

Я думаю, что все элементы от itCurrent до (кроме it2) находятся в этом диапазоне.

wohlstad 01.07.2024 17:45

Мне нужно найти ближайшие ключи к -3 и 3.

Gaurav K 01.07.2024 17:48

Если вам нужно найти один ближайший ключ, это либо itCurrent, либо один перед it2. Но ваш вопрос заключался в том, как найти все ключи в диапазоне (на который, кажется, я ответил) – не так ли? Может быть, вы можете опубликовать новый вопрос?

wohlstad 01.07.2024 17:51

Редактирую пост.

Gaurav K 01.07.2024 17:52

@GauravK, вам не следует редактировать вопрос таким образом, чтобы сделать недействительными существующие ответы. Вам следует опубликовать новый вопрос.

wohlstad 01.07.2024 17:53

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