将 std::less 用于一组指针

Using std::less for a set of pointers

提问人:Danger69420 提问时间:12/6/2021 最后编辑:EnlicoDanger69420 更新时间:12/7/2021 访问量:270

问:

我有一个类,我声明了一个这样的集合:

std::set<UPFIR::RetentionSignal*> _retSignalSet; 

我正在尝试在其上使用 std::less 比较功能。我尝试了这样的事情:

std::set<UPFIR::RetentionSignal*, std::less<UPFIR::RetentionSignal*>> _retSignalSet; 

我得到的反馈是“添加 std::less 不会使它成为确定性。你必须比较这个名字“,有人可以解释一下我如何做到这一点,因为我以前没有使用过 std::less ?

谢谢

C++ 指针 std stdset

评论

1赞 j6t 12/6/2021
注释“不会使它确定性”是错误的,因为它被定义为提供指针的总顺序。但是,该订单可能不是完成您的任务所需的订单。如果订单必须按名称,则无济于事。您必须提供一个自定义比较器来比较名称。std::lessstd::less
0赞 Alan Birtles 12/6/2021
请提供一个最小的可重复示例。代码应该做什么?什么?RetentionSignal
1赞 Öö Tiib 12/6/2021
@masoud反对票可能是因为 OP 收到了“你必须比较名称”的请求,但他的问题既没有给出“名称”参与的代码,也没有说明“名称”的性质。因此,这个问题是无法回答的。
0赞 Danger69420 12/6/2021
@AlanBirtles 很抱歉信息不完整,我在这里尝试做的是将指针保存在集合中,然后通过遍历信息将其转储到文件中来提取信息。我这样做的方法是: for (auto it: _retSignalSet) { std::string s1,s2; //填充字符串 } mprintf(“%s%s”, s1,s2);
2赞 masoud 12/6/2021
@Danger69420:你应该把代码放在问题中。

答:

0赞 j6t 12/7/2021 #1

如果要求是集合应按名称排序,则无济于事。您必须提供一个自定义比较器来比较名称。例如(只是一个未经测试的草图):std::less

struct LessByName {
    bool operator<(UPFIR::RetentionSignal* a, UPFIR::RetentionSignal* b)
    {
        return a->name < b->name;
    }
};

然后像这样使用它

std::set<UPFIR::RetentionSignal*, LessByName> _retSignalSet;

顺便说一句,注释“不会使它确定性”是错误的,因为被定义为提供指针的总顺序。您获得的订单可能不是完成任务所需的订单。std::lessstd::less

评论

0赞 Danger69420 12/7/2021
嗨@j6t这对于在 main 中定义的集合非常有效,但是如果该集合是在类中声明的,该怎么办: class foo { private: std::set<UPFIR::RetentionSignal*> _retSignalSet; }
0赞 j6t 12/7/2021
@Danger69420 问题出在哪里?如果将定义移动到定义之前的类中,会有帮助吗?struct LessByNamestd::set... _retSignalSet
0赞 Danger69420 12/9/2021
是的,在类内移动结构体工作得很好,谢谢。