如何知道unordered_map <t *>包含一个值?

时间:2016-05-23 19:38:55

标签: c++

我有一个班级节点:

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>是不可能的。

3 个答案:

答案 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);