设置::查找() 找不到

set::find() doesn't find

本文关键字:找不到 查找 设置      更新时间:2023-10-16

我有一个问题与这段代码(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);

操作符

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<没有建立严格的弱排序。例如,根据比较器,{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);
}

综合前面的答案:

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

cubeBox cpy = *i;
cubeBoxData.erase(i);
cpy.addCube(x,y,z);
cubeBoxData.insert(cpy);