如何正确地重载运算符<用于我的用户定义类型的std :: map?

时间:2012-04-30 12:01:57

标签: c++ dictionary overloading operator-keyword

我有一个名为set的类,它是一个动态分配的数组,在内部充当具有所需重载运算符的容器。这个数组(1D)存储一个(天文数字很大,有时)数量的整数,当整个集合插入到这个数组中时,我用std :: sort排序(比使用std :: set快得多)。这些集合被放入std :: map中,它们作为double的一个键,当std :: map已经有了set,​​并且如果当前set不在std :: map容器中,那么它会被加入计数器为“0”。我试图重载运算符<因为std :: map需要它。但它导致了分段错误。数组的第一个成员(名为arr)存储集合中的整数数,即总数组长度为arr [0] +1。

我不使用向量或新数组类型的原因是因为我快速运行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;

}

1 个答案:

答案 0 :(得分:2)

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

    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) < (2 0 3)打破了等效的传递性。