当然,有一个类重载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;
答案 0 :(得分:7)
实际上,这很微妙,但你不只想为该代码添加自定义比较器。
您需要选择一个这些选项才能使代码有意义:
使用boost::ptr_multiset<Rectangle>
(推荐)
使用std::multiset<std::shared_ptr<const Rectangle>, YourCustomComparator>
否则,您可以在地图内部修改密钥(它们不会是const
),这很糟糕,会导致您进入未定义的行为。
答案 1 :(得分:3)
shared_ptr<T>
被设计为T*
的替代品,因此其行为类似于:
std::multiset<Rectangle*> elements;
即,它将按内存地址排序。
如果您想使用基础operator<
,您需要指定一个间接并进行比较的比较器:[p,q]{*p < *q}