У меня есть 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»?





вам нужно только указать оператор == и <.
upper_bound и lower_bound похожи на любой другой метод поиска, поэтому вам нужен такой же тип объекта для сравнения - в вашем случае «фиктивный» объект с требуемым значением s.
редактировать: комментарии верны, вам нужен только operator <для lower / upper_bound и find. Но если вы хотите вызвать другие методы в своем контейнере, вам также понадобится operator ==. Например. если вы хотите sort () свой контейнер, вам понадобится operator ==.
Две перегрузки, необходимые для всех контейнеров STL, - это operator <и operator ==. Я считаю, что лучше всего реализовать и то, и другое.
Конечно, на этот вопрос можно было бы ответить более полно, реализовав функтор сравнения в самой карте, не полагаясь на объекты. Часто это хороший способ реализовать различные способы вызова find () на карте.
Второе, что сказал Майк. Вам нужен только <, а не ==.
Поскольку class X является ключом для мульти-карты, параметр для upper_bound() / lower_bound() должен быть этого типа. Если class X имеет неявное преобразование из std::string (который является типом X::s), вы можете использовать это как параметр для upper_bound() / lower_bound().
Сравнение по умолчанию для мульти-карты - это less<>, который просто вызывает operator <() - так что это единственный оператор, который вам необходим в class X для работы мульти-карты.
Вам не нужно указывать оператор == ().