如何知道unordered_map<T*>包含值?
How to know unordered_map<T*> contains a value?
我有一个类节点:
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);
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 如何在for循环中包含两个索引值的测试条件
- 范围 v3 可以包含初始值设定项列表的工作吗?
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 复制包含C++所有元素的对象!(构造函数和赋值,最佳实践?
- 创建一个包含 c++ 默认值的环境文件
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- boost::包含提升单元的元组的哈希值
- C++ - 是否可以让子类按值包含包含类?
- C++17:使用 std::optional 来评估枚举是否包含值
- 将包含二进制数据的 QByteArray 传递到按值运行
- 如何在两个列表中比较和获取非包含值
- 如何知道unordered_map<T*>包含值?
- 为什么我不能声明同时具有模板容器和模板包含值的类型?
- 类属性不包含值
- 包含值地址的字符串 ->该值的指针
- 仅当数组中尚未包含值时,才向数组添加值
- 如何找到包含值及其在 c++ 中出现的向量的分位数
- 提升::变体与包含值的比较
- 为什么在编组之后,数组中只有一个元素包含值