Да, есть класс с перегруженным operator<
…
class Rectangle {
// ...
const inline bool operator< (const Rectangle &rhs) const {
return x < rhs.x || (x == rhs.x && y < rhs.y);
}
}
…делает set
все еще используете эту перегрузку, когда элементы обернуты в умный указатель?
std::multiset<std::shared_ptr<Rectangle>> elements;
shared_ptr<T>
разработан в качестве замены для замены T*
так он ведет себя как:
std::multiset<Rectangle*> elements;
А именно, он будет сортировать по адресу памяти.
Если вы хотите использовать базовый operator<
, вам нужно будет указать компаратор, который косвенно обращается и делает сравнение: [p,q]{*p < *q}
На самом деле, это тонко, но вы делаете не просто хочу добавить собственный компаратор к этому коду.
Вам нужно выбрать из один из этих вариантов кода имеет смысл:
использование boost::ptr_multiset<Rectangle>
(рекомендуемые)
использование std::multiset<std::shared_ptr<const Rectangle>, YourCustomComparator>
В противном случае вы сможете изменить ключи, пока они находятся внутри карты (они не будут const
), что ужасно и приведет вас к неопределенному поведению.