Требование к ключу в std :: multimap

У меня есть std :: multimap, где ключ - это настраиваемый класс. Что-то вроде этого:

Class X {
public:
    std::string s;
    int x;
    operator <(const X& other) const { return s < other.s; }
};
std::multimap<X, int> mymap;

Теперь я хотел бы использовать upper_bound и lower_bound для перебора всех элементов с одинаковым значением «s». Мне нужно реализовать какой-то другой оператор для X (например: ==). Или так и будет нормально работать?

Кроме того, что я должен указать в качестве аргумента для верхняя граница и нижняя граница? Я полагаю, мне следует создать фиктивный объект с желаемым значением «s»?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
0
2 028
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вам нужно только указать оператор == и <.

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

редактировать: комментарии верны, вам нужен только operator <для lower / upper_bound и find. Но если вы хотите вызвать другие методы в своем контейнере, вам также понадобится operator ==. Например. если вы хотите sort () свой контейнер, вам понадобится operator ==.

Две перегрузки, необходимые для всех контейнеров STL, - это operator <и operator ==. Я считаю, что лучше всего реализовать и то, и другое.

Конечно, на этот вопрос можно было бы ответить более полно, реализовав функтор сравнения в самой карте, не полагаясь на объекты. Часто это хороший способ реализовать различные способы вызова find () на карте.

Вам не нужно указывать оператор == ().

Michael Burr 19.10.2008 03:14

Второе, что сказал Майк. Вам нужен только <, а не ==.

Chris Jester-Young 19.10.2008 03:16
Ответ принят как подходящий

Поскольку class X является ключом для мульти-карты, параметр для upper_bound() / lower_bound() должен быть этого типа. Если class X имеет неявное преобразование из std::string (который является типом X::s), вы можете использовать это как параметр для upper_bound() / lower_bound().

Сравнение по умолчанию для мульти-карты - это less<>, который просто вызывает operator <() - так что это единственный оператор, который вам необходим в class X для работы мульти-карты.

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