Мне нужен набор пользовательских структур, чтобы можно было быстро получить экземпляр с наименьшим заданным параметром. Однако я обнаружил, что std :: set считает некоторые экземпляры одинаковыми, даже если они имеют разные значения. Вот мой пример программы:
#include <set>
#include <iostream>
struct S
{
int foo, bar;
S(int foo, int bar): foo(foo), bar(bar) {}
};
inline bool operator<(const S& a, const S& b)
{
return a.foo < b.foo;
}
int main()
{
std::set<S> baz;
baz.emplace(1, 2);
baz.emplace(1, 3);
std::cout << baz.size();
return 0;
}
Эта программа печатает 1
std :: set считает S(1, 2)
и S(1, 3)
одинаковыми. Я предполагаю, что это потому, что bar
не используется при их сравнении. Но мне нужен набор, чтобы сохранить оба элемента, как мне решить эту проблему?
РЕДАКТИРОВАТЬ: я чувствую, что не правильно сформулировал свой вопрос: я хочу сохранить экземпляры, которые не совсем совпадают, но std::multiset
не работает для меня, потому что я не хочу, чтобы идентичные экземпляры были в контейнере
РЕШЕНИЕ: я думаю, что понимаю, что было не так. Я предположил, что если для 2 элементов a < b
и b < a
оба будут истинными, это приведет к неопределенному поведению. Но std :: set проверяет это, поэтому он удаляет один из элементов. Лучшее решение для меня - это изменить компаратор, который включает в себя bar
.