set :: find()找不到

时间:2013-01-12 00:24:44

标签: c++

我的代码有问题(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;是错的,我错过了一些愚蠢的东西,但我不知道它是什么。

2 个答案:

答案 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);