如何知道unordered_map<T*>包含值?

How to know unordered_map<T*> contains a value?

本文关键字:gt 包含值 lt 何知道 unordered map      更新时间:2023-10-16

我有一个类节点:

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 方法查找是否找到指向节点的指针,但我需要在 map 中找到一个与 x 和 y 中的节点相等的节点。

我之所以有映射到指针,是因为节点不是一个微不足道的类,并且有其他成员变量,因此使用 unordered_map<node,node> 是毫无疑问的。

如果您无法像其他答案所建议的那样控制地图结构,那么以下是一个潜在的解决方案(未经测试,可能需要小的调整):

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*>是一个奇怪的结构,我强烈建议您根据实际需求重新考虑此数据结构。

从您的推理来看,不清楚为什么您仍然无法使用unordered_map<node, node>.

但是,由于您决定存储指针并执行值比较,因此您唯一的选择是容器范围的线性搜索,例如std::find_if

如果你控制这个映射的构造,你可以给它一个与等于的定义一致的相等函数和哈希函数:

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