我有一个名为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;
}
答案 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)
打破了等效的传递性。