使用 std::less 作为一组指针
Using std::less for a set of pointers
我有一些 class 声明的集合是这样的:
std::set<UPFIR::RetentionSignal*> _retSignalSet;
我正在尝试对其使用 std::less 比较功能。我试过这样的事情:
std::set<UPFIR::RetentionSignal*, std::less<UPFIR::RetentionSignal*>> _retSignalSet;
我得到的反馈是“添加 std::less 不会使其成为确定性。你必须比较名称”,有人可以解释一下我如何实现这一点,因为我还没有使用 std::less之前?
谢谢
如果要求集合应按名称排序,那么 std::less
无济于事。您必须提供一个自定义比较器来比较名称。例如(只是一个未经测试的草图):
struct LessByName {
bool operator<(UPFIR::RetentionSignal* a, UPFIR::RetentionSignal* b)
{
return a->name < b->name;
}
};
然后像
一样使用它
std::set<UPFIR::RetentionSignal*, LessByName> _retSignalSet;
顺便说一句,注释“std::less
不会使其具有确定性”是错误的,因为 std::less
被定义为提供指针的总顺序。您收到的订单可能不是完成任务所需的订单。
我有一些 class 声明的集合是这样的:
std::set<UPFIR::RetentionSignal*> _retSignalSet;
我正在尝试对其使用 std::less 比较功能。我试过这样的事情:
std::set<UPFIR::RetentionSignal*, std::less<UPFIR::RetentionSignal*>> _retSignalSet;
我得到的反馈是“添加 std::less 不会使其成为确定性。你必须比较名称”,有人可以解释一下我如何实现这一点,因为我还没有使用 std::less之前?
谢谢
如果要求集合应按名称排序,那么 std::less
无济于事。您必须提供一个自定义比较器来比较名称。例如(只是一个未经测试的草图):
struct LessByName {
bool operator<(UPFIR::RetentionSignal* a, UPFIR::RetentionSignal* b)
{
return a->name < b->name;
}
};
然后像
一样使用它std::set<UPFIR::RetentionSignal*, LessByName> _retSignalSet;
顺便说一句,注释“std::less
不会使其具有确定性”是错误的,因为 std::less
被定义为提供指针的总顺序。您收到的订单可能不是完成任务所需的订单。