我有一个班级节点:
class node{
public:
int x,y;
// some other variables
};
其他地方有一个unordered_map<node*,node*>
。如何在地图中找到特定节点?如果node_a.x==node_b.x && node_a.y==node_b.y
,则认为两个节点等于。 unordered_map.find
方法查找是否找到指向节点的指针,但我需要在地图中找到一个与x和y中的节点相等的节点。
我映射到指针的原因是节点不是一个普通的类,并且有其他成员变量,所以使用unordered_map<node,node>
是不可能的。
答案 0 :(得分:3)
如果您无法控制地图构造,则另一个答案显示,以下是一个潜在的解决方案(未经测试,可能需要小的调整):
std::unordered_map<node*,node*> map;
//...
// node object to find
node n;
n.x = 0;
n.y = 0;
std::find_if(map.begin(), map.end(),
[n](const std::pair<node*,node*>& _node)
-> bool { return _node.first->x == n.x && _node.second->y == n.y; });
但请注意,std::unordered_map<node*,node*>
是一个奇怪的结构,我强烈建议您根据实际需求重新考虑这个数据结构。
答案 1 :(得分:2)
根据你的推理,目前还不清楚为什么你仍然无法使用unordered_map<node, node>
。
但是,由于您决定存储指针但仍然执行值比较,因此您唯一的选择是容器范围的线性搜索,例如std::find_if
。
答案 2 :(得分:2)
如果你控制这个地图的构造,你可以给它一个与equals定义一致的相等函数和散列函数:
auto hash_fun = [] (node* obj) { return /* some hash value computed from x and y */; };
auto key_equal = [] (node* a, node* b) { return a->x == b->x && a->y == b->y; };
typedef std::unordered_map<node*,node*,decltype(hash_fun),decltype(key_equal)> node_map;
node_map map(0, hash_fun, key_equal);