Вопрос

У меня есть 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 () на карте.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top