如何让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
相关产品推荐
相关产品推荐

