使用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
相关产品推荐
相关产品推荐

