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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:12:02