如何用C++标准库替代存POD指针的红黑树以避免冗余存储?
针对红黑树存储MyPod指针的替代方案
首选方案:std::set<MyPod*>
直接用std::set<MyPod*>完全满足需求。它本身是基于红黑树实现的有序容器,仅存储单个元素(即MyPod指针),不存在冗余的键值对。只需将自定义比较函数传入模板参数即可:
struct MyPodCompare { bool operator()(const MyPod* a, const MyPod* b) const { // 按业务需求实现指针比较逻辑 return /* 具体比较结果 */; } }; std::set<MyPod*, MyPodCompare> pod_set;
查找时调用find()方法,返回的迭代器直接指向树中已存在的目标指针,完全匹配你的需求。
其他可选方案(不推荐,仅作补充)
std::map搭配空类型:可以将第二个元素设为std::monostate(C++17及以上)或void*(需用nullptr占位),比如std::map<MyPod*, std::monostate, MyPodCompare>。但这种方式仍会存储无意义的状态值,冗余问题只是被弱化,不如std::set直接高效。- 自定义红黑树:若对标准库容器有特殊定制需求,可以自行实现红黑树节点,仅存储MyPod指针和红黑树所需的结构(颜色、子节点、父节点)。但这会增加代码维护成本,标准库容器已足够稳定高效,非必要不建议这么做。
针对你的疑问的明确回复
- 不能把第二个元素设为
void:C++容器的元素类型必须是完整类型,void不满足要求。 - 用单个指针替换pair:
std::set就是此类设计,它的元素就是单个值,无需pair结构。 - 将pair改为union:完全没必要,union无法解决冗余问题,反而会引入类型安全隐患,远不如
std::set实用。
内容的提问来源于stack exchange,提问作者Swiss Frank
相关产品推荐
相关产品推荐

