2

授予有一个重载的类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;
4

2 回答 2

7

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

您需要从以下选项中进行选择,以使代码有意义:

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

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

否则,您将能够在它们位于地图内时修改键(它们不会const),这很可怕,并且会导致您陷入未定义的行为。

于 2013-09-01T22:34:53.527 回答
3

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

std::multiset<Rectangle*> elements;

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

如果你想使用底层operator<,你需要指定一个比较器来间接进行比较:[p,q]{*p < *q}

于 2013-09-01T22:25:22.157 回答