Требование к ключу в std :: multimap - PullRequest
1 голос
/ 19 октября 2008

У меня есть 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 ? Я предполагаю, что должен создать фиктивный объект с желаемым значением "s"?

Ответы [ 2 ]

5 голосов
/ 19 октября 2008

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

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

0 голосов
/ 19 октября 2008

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

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

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

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

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

...