Требование к ключу в 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 (например: ==). Или это будет работать так же, как это?
Кроме того, что я должен предоставить в качестве аргумента для upper_bound и lower_bound ? Я предполагаю, что должен создать фиктивный объект с желаемым значением & Quot; s & Quot;?
Решение
Поскольку class X
является ключом для мультикарты, параметр upper_bound()
/ lower_bound()
должен быть этого типа. Если std::string
имеет неявное преобразование из X::s
(это тип less<>
), вы можете использовать его в качестве параметра для operator <()
/ <=>.
Сравнением по умолчанию для мультикарты является <=>, которая просто вызывает <=> - так что это единственный оператор, который вы должны иметь в <=> для работы мультикарты.
Другие советы
вам нужно только указать оператор == и <.
upper_bound и lower_bound точно такие же, как и любой другой метод find-type, поэтому вам нужно сравнить объект такого же типа - в вашем случае, с «фиктивным» объектом с требуемым значением s.
edit : комментарии верны, вам нужен только оператор < для lower / upper_bound и найти. Но если вы хотите вызывать другие методы в вашем контейнере, вам также понадобится оператор ==. Например. если вы хотите отсортировать () ваш контейнер, вам понадобится оператор ==.
2 перегрузки, которые вам нужны для всех контейнеров STL, являются оператором < и оператор ==. Я считаю, что лучше всего применять их оба.
Конечно, на этот вопрос также можно было бы ответить более полно, реализовав функтор сравнения в самой карте, не полагаясь на объекты. Часто это хороший способ реализовать различные способы вызова find () на карте.