这就是我所拥有的:
struct Foo {
int index;
}
std::set<std::shared_ptr<Foo>> bar;
我希望通过索引而不是默认的bar
函数来命令std::less<std::shared_ptr<T>>
的元素,这与指针相关。
我读过我可以输入 std::set<std::shared_ptr<Foo>, std::owner_less<std::shared_ptr<Foo>>> bar
,但我更喜欢坚持以前的语法。
我尝试定义std::less<std::shared_ptr<Foo>>
,但它实际上并没有被set
函数使用。有没有办法实现这个目标?
答案 0 :(得分:8)
如果你想通过它们的指数进行比较,你必须编写一个比较器来检查它们的指数。 std::less<>
会做错事(因为它不会知道index
)而std::owner_less<>
会做错事(因为它仍然无法比较Foo
1}} s,而是与它们的所有权语义有关。)
你必须写:
struct SharedFooComparator {
bool operator()(const std::shared_ptr<Foo>& lhs,
const std::shared_ptr<Foo>& rhs) const
{
return lhs->index < rhs->index;
}
};
并使用它:
std::set<std::shared_ptr<Foo>, SharedFooComparator> bar;
您还可以将其概括为shared_ptr的通用比较器:
struct SharedComparator {
template <typename T>
bool operator()(const std::shared_ptr<T>& lhs,
const std::shared_ptr<T>& rhs) const
{
return (*lhs) < (*rhs);
}
};
然后简单地使Foo
具有可比性。
答案 1 :(得分:-1)
您可以在less<shared_ptr<Foo>>
命名空间中提供自己的std
专精。
namespace std
{
template<>
class less<shared_ptr<Foo>>
{
public:
bool operator()(const shared_ptr<Event>& a, const shared_ptr<Event>& b)
{
// Compare *a and *b in some way
}
};
}
然后你可以在没有比较器的情况下形成set<shared_ptr<Foo>>
。我需要priority_queue<shared_ptr<Foo>>
,我不想使用priority_queue<Foo*, vector<Foo*>, int (*)(const Foo*, const Foo*)>
。我并不为此感到自豪,但它确实有效。