使用std::unordered_map记录已处理Col对象是否合理?是否需用稀疏矩阵?
问题分析与解答
首先得先指出你代码里的几个关键错误,这些错误会直接导致去重逻辑完全失效:
operator==的错误实现:你的相等运算符里是和自身成员比较(o1 == o1),这会让任意两个Col对象都被判定为相等,完全不符合去重需求。正确实现应该是和other的成员对比:
bool operator==(const Col &other) const { return o1 == other.o1 && o2 == other.o2 && o3 == other.o3; }
- 哈希函数的错误:
std::hash<void>是非法的,需要用std::hash<void*>来哈希指针;- 代码末尾
k.o3缺少闭合括号; - 单纯用加法组合哈希值会导致极高的碰撞概率(不同指针组合可能算出相同结果),更合理的做法是用移位异或降低碰撞,比如:
template <> struct std::hash<Col> { std::size_t operator()(const Col& k) const { using std::size_t; using std::hash; size_t h1 = hash<void*>()(k.o1); size_t h2 = hash<void*>()(k.o2); size_t h3 = hash<void*>()(k.o3); return h1 ^ (h2 << 1) ^ (h3 << 2); } };
unordered_map的冗余使用:你只需要记录元素是否已处理,不需要存储bool值,用std::unordered_set<Col>更合适,既节省空间,代码也更简洁:
std::unordered_set<Col> done_set; for (const Col& c : col_list) { if (done_set.insert(c).second) // insert成功说明是新元素 { process(c); } }
原方式是否合理?
修正上述错误后,用unordered_set(或修正后的unordered_map)的方式是合理的。这种方式的平均查找/插入时间复杂度为O(1),对于长vector的去重处理效率很高,尤其是重复元素较多时,能有效减少process的调用次数。
稀疏矩阵是否更合适?
完全不合适。稀疏矩阵是用来表示大部分元素为默认值的多维矩阵数据,而你的场景是对自定义结构体对象去重,和矩阵维度、稀疏数据存储完全不相关,没有任何使用稀疏矩阵的理由。
内容的提问来源于stack exchange,提问作者Omroth
相关产品推荐
相关产品推荐

