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

如何让std::set<Node*>的find()通过整数值查找对应Node指针?

修改方案

要实现按Node的value字段排序且**支持传入整数调用find()**的需求,需要做以下几处修改:

1. 定义透明比较器结构体

替换原有Node类的operator<,改用自定义的透明比较器,让std::set既支持指针排序,又能识别整数类型的查找参数:

struct NodePtrComparator {
    // 用于set内部排序:按Node的value从小到大排列
    bool operator()(const Node* a, const Node* b) const {
        return a->value < b->value;
    }
    // 支持Node*与int的双向比较,为异构查找提供依据
    bool operator()(const Node* a, int val) const {
        return a->value < val;
    }
    bool operator()(int val, const Node* b) const {
        return val < b->value;
    }
    // 标记为透明比较器,启用std::set的异构查找功能(C++14及以上支持)
    using is_transparent = void;
};

2. 修改std::set的模板参数

将存储Node指针的std::set,指定使用上面定义的比较器:

// 原定义:std::unordered_map<int, std::set<Node*>> nodes;
std::unordered_map<int, std::set<Node*, NodePtrComparator>> nodes;

3. 移除Node类中冗余的operator<

删掉Node类里的bool operator< (const Node* rhs) const {...},避免与自定义比较器冲突:

class Node{
public:
    Node* back1 = nullptr;
    Node* back2 = nullptr;
    int value;

    Node(int value) {
        this->value = value;
    }
    // 移除下面这行冗余代码
    // bool operator< (const Node* rhs) const {return this->value < rhs->value;}
};

4. 直接使用整数调用find()

现在可以直接传入整数到set的find方法中,查找对应value的Node指针:

// 原代码中的find调用无需修改,直接生效
if (current != 0 && current < m && nodes[current % 10].find(current) == nodes[current % 10].end()) {
    // ... 后续逻辑
}

注意事项

  • 需确保编译环境支持C++14或更高版本,因为透明比较器的异构查找是C++14引入的特性。
  • 如果必须兼容C++11,可改用遍历set查找匹配value的节点,但效率会低于异构查找。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:40:21