You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用std::less处理指针型std::set无确定性,如何自定义比较规则

实现方案

问题本质

你默认使用的std::less<UPFIR::RetentionSignal*>会直接比较指针的内存地址,程序每次运行时对象分配的内存地址不固定,也无法匹配按对象名称排序的需求,因此不具备确定性。

实现步骤

1. 自定义比较谓词

编写独立的比较结构体,重载()运算符,实现基于对象名称的比较逻辑:

struct RetentionSignalCompare {
    bool operator()(const UPFIR::RetentionSignal* a, const UPFIR::RetentionSignal* b) const {
        // 空指针判断,避免解引用崩溃,空指针默认排在非空指针前
        if (a == nullptr && b == nullptr) return false;
        if (a == nullptr) return true;
        if (b == nullptr) return false;
        // 请根据你的类实际实现调整获取名称的方式,比如替换为a->name直接访问成员变量
        return a->getName() < b->getName();
    }
};

如果你的名称是C风格字符串(char*类型),把返回行替换为:

return strcmp(a->getName(), b->getName()) < 0;

2. 为std::set指定自定义比较器

修改你的容器声明即可:

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

补充说明(可选)

如果你一定要通过特化std::less实现,可以参考下面的写法,但该方案会特化标准库模板,容易引发命名冲突,不优先推荐:

template<>
struct std::less<UPFIR::RetentionSignal*> {
    bool operator()(const UPFIR::RetentionSignal* a, const UPFIR::RetentionSignal* b) const {
        if (a == nullptr && b == nullptr) return false;
        if (a == nullptr) return true;
        if (b == nullptr) return false;
        return a->getName() < b->getName();
    }
};

特化完成后你原来写的std::set<UPFIR::RetentionSignal*, std::less<UPFIR::RetentionSignal*>> _retSignalSet;就可以正常按名称比较。

内容的提问来源于stack exchange,提问作者Danger69420

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:45:03