我的代码有问题(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);
运营商&lt;对于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。
我认为我的运营商&lt;是错的,我错过了一些愚蠢的东西,但我不知道它是什么。
答案 0 :(得分:5)
您定义的operator<
未建立strict weak ordering。例如,根据您的比较器,{1,0,1} < {0,1,0}
和{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);
}
答案 1 :(得分:0)
整合上一个答案:
集合的元素是const的原因,你不能只是const_cast和修改,因为这样做你不会告诉集合它应该重新排序你的元素。由于您的addCube
函数可能会改变元素的排序顺序,因此正确的方法是:
cubeBox cpy = *i;
cubeBoxData.erase(i);
cpy.addCube(x,y,z);
cubeBoxData.insert(cpy);