You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用std::unordered_map记录已处理Col对象是否合理?是否需用稀疏矩阵?

问题分析与解答

首先得先指出你代码里的几个关键错误,这些错误会直接导致去重逻辑完全失效:

  1. operator==的错误实现:你的相等运算符里是和自身成员比较(o1 == o1),这会让任意两个Col对象都被判定为相等,完全不符合去重需求。正确实现应该是和other的成员对比:
bool operator==(const Col &other) const
{ 
    return o1 == other.o1 && o2 == other.o2 && o3 == other.o3;
}
  1. 哈希函数的错误:
    • 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);
  }
};
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 02:13:11