【问题标题】:How to correctly overload operator< for use in std::map with my user-defined type?如何正确重载 operator< 以使用我的用户定义类型在 std::map 中使用?
【发布时间】:2012-04-30 12:01:57
【问题描述】:

我有一个名为 set 的类,它是内部动态分配的数组,它充当具有所需重载运算符的容器。这个数组 (1D) 存储了一个(有时非常大)整数,当整个集合插入到这个数组中时,我用 std::sort 排序(比使用 std::set 快得多)。这些集合被放入 std::map 中,它们充当双精度的键,当 std::map 已经具有该集合并且如果当前集合不在 std::map 容器中则它被插入时递增与计数器“0”。我试图重载 operator

我不使用向量或新数组类型的原因是因为我的 RAM (64GB) 很快耗尽,这些集合在峰值时刻的大小为 2^10 到 2^11(生成子集),所以我想以最小的空间开销创建我自己的向量版本。

bool operator<(const set& s1, const set& s2)
{
    if (s1.arr[0] < s2.arr[0])
        return true;
    else if (s1.arr[0] > s2.arr[0])
        return false;

    if (s1.arr[0] == s2.arr[0])
    {
        for (int i = 1; i < s1.arr[0]+1; i++)
        {
            if (s1.arr[i] > s2.arr[i]) return false;
        }
    }
    return true;

}

【问题讨论】:

  • 您的主要if (a &lt;= b) ; else return false; 可以替换为if (a &gt; b) return false;
  • 请给你的班级起个名字,set 是一个标准库容器。
  • @juanchopanza:set 不是标准库容器,std::set 是。
  • 我要补充一点,如果它是一个成员函数,它应该是一个 const 函数。
  • 你不需要为你的类重载 op

标签: c++ dictionary overloading operator-keyword


【解决方案1】:

你应该改变你的内部循环比较类似于你的长度比较:

    for (int i = 1; i < s1.arr[0]+1; i++)
    {
        if (s1.arr[i] < s2.arr[i])
            return true;
        else if (s1.arr[i] > s2.arr[i])
            return false;
    }

这样,您的比较运算符将实现严格的弱排序。你原来的算子没有,比如(2 0 2)(2 1 1)不可比,(2 1 1)(2 0 3)不可比,但(2 0 2) &lt; (2 0 3)打破了等价的传递性。

【讨论】:

  • 或者更精简的版本return std::lexicographical_compare(s1.arr+1, s1.arr+s1.arr[0]+1, s2.arr+1, s2.arr+s2.arr[0]+1);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 2015-03-01
相关资源
最近更新 更多