当元素被智能指针包装时,std :: set是否仍然排序?

时间:2013-09-01 22:18:19

标签: c++ c++11

当然,有一个类重载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;

2 个答案:

答案 0 :(得分:7)

实际上,这很微妙,但你只想为该代码添加自定义比较器。

您需要选择一个这些选项才能使代码有意义:

  1. 使用boost::ptr_multiset<Rectangle>(推荐)

  2. 使用std::multiset<std::shared_ptr<const Rectangle>, YourCustomComparator>

  3. 否则,您可以在地图内部修改密钥(它们不会是const),这很糟糕,会导致您进入未定义的行为。

答案 1 :(得分:3)

shared_ptr<T>被设计为T*的替代品,因此其行为类似于:

std::multiset<Rectangle*> elements;

即,它将按内存地址排序。

如果您想使用基础operator<,您需要指定一个间接并进行比较的比较器:[p,q]{*p < *q}