4

我对这段代码有疑问(cubeBoxData 是一组 cubeBox):

cubeBox temp(bx,by,bz);
cubeBoxData.insert(temp);
set<cubeBox>::iterator i = cubeBoxData.find(temp);
const_cast<cubeBox&>(*i).addCube(x,y,z);

问题是 cubeBoxData.find(temp); 没有找到 temp,然后程序尝试调用 addCube() 失败,我不知道为什么,因为这段代码工作正常(只需更改第三行):

cubeBox temp(bx,by,bz);
cubeBoxData.insert(temp);
set<cubeBox>::iterator i = find(cubeBoxData.begin(),cubeBoxData.end(),temp);
const_cast<cubeBox&>(*i).addCube(x,y,z);

cubeBox 的运算符 < 是:

bool operator<(const cubeBox& c) const {
    return x<c.x ? true : y<c.y ? true : z<c.z ? true : false;
}

addCube 不会改变 x、y 或 z。

我认为我的 operator< 是错误的,我错过了一些愚蠢的东西,但我不知道它是什么。

4

2 回答 2

5

您定义的operator<没有建立严格的弱排序。例如,根据您的比较器,that{1,0,1} < {0,1,0}和 that都是这种情况{0,1,0} < {1,0,1}。结果,对 的所有操作set都具有未定义的行为。

您应该重写您的比较操作,以便它确实建立严格的弱排序。最简单的(?)方法是使用std::tuple

bool operator<(const cubeBox& c) const {
    return std::tie(x,y,z) < std::tie(c.x,c.y,c.z);
}
于 2013-01-12T00:36:21.083 回答
0

整合前面的答案:

集合的元素是 const 是有原因的,你不能只是 const_cast 和修改,因为这样做你并没有告诉集合它应该重新排序你的元素。由于您的addCube函数可能会更改元素的排序顺序,因此正确的方法是:

cubeBox cpy = *i;
cubeBoxData.erase(i);
cpy.addCube(x,y,z);
cubeBoxData.insert(cpy);
于 2013-01-12T01:07:07.533 回答