开放寻址哈希表robin_hood插入数据损坏问题求助
哈希表替换后数据损坏排查求助
我尝试将std::unordered_map<uint64_t, edge_type>(其中edge_type是包含两个uint32_t成员的结构体)替换为robin_hood::unordered_flat_map<uint64_t, edge_type>,但代码出现自旋锁问题。起初猜测是迭代器失效导致,换成robin_hood::unordered_node_map后结果正确,但性能反而比std::unordered_map更差,似乎验证了迭代器失效的假设。
随后追踪代码发现插入的数据出现损坏,核心代码片段如下:
robin_hood::unordered_flat_map<uint64_t, edge_type> edges_; void add_edge(uint32_t x, uint32_t y, uint32_t z, uint32_t f) { const uint64_t e = detail::make_edge(x, y); // ... 其他逻辑 std::cout << "e: " << e << " (" << f << ", " << z << ")" << std::endl; edges_.emplace(e, edge_type(f, z)); edge_type edg = edges_.at(e); std::cout << edg.face_ << " " << edg.vertex_ << std::endl; ZI_ASSERT(edges_.at(e) == edge_type(f, z)); }
断言语句执行失败,添加打印日志后发现:最后一次插入的键对应的值本应为(2,2),但取出的值却是(1,2),日志输出如下:
e: 18446744073709551614 (1, 2) new node 1 2 e: 18446744069414584317 (1, 0) new node 1 0 e: 18446744065119617023 (1, 1) new node 1 1 e: 18446744073709551613 (2, 3) new node 2 3 e: 18446744065119617020 (2, 0) new node 2 0 e: 18446744060824649727 (2, 2) overwrite_node 1 2 Assertion failed: (edges_.at(e) == edge_type(f,z)), function add_edge, file tri_mesh.hpp, line 175.
我换用另外两种扁平哈希表实现时,仍遇到相同的数据损坏问题,请问可能是什么原因导致的?
内容的提问来源于stack exchange,提问作者SapphireSun
相关产品推荐
相关产品推荐

