设置::查找() 找不到
set::find() doesn't find
我有一个问题与这段代码(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);
相关文章:
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 找不到QtResource文件中的文件
- VC++本机单元测试,找不到调试符号
- RegGetValue在当前用户下找不到名称
- 带有 -stdlib=libc++ 的 clang++ 9.0.1 找不到<optional>
- c++找不到具有相同哈希的无序集合元素
- 找不到以下加速库:boost_fiber
- 查找窗口找不到进程
- 字符串查找方法找不到第一字母
- cmake 找不到提升库,因为它查找了错误的文件名
- Linux 查找 glxext.h 函数的对象 -> 找不到正确的 .so -> "undefined reference"
- 编译C++mac,查找找不到的头文件
- 什么时候在构造函数的类定义中通过普通查找找不到 mem-initializer-id?
- 找不到标识符,即使使用依赖于参数的查找和运算符<<也不明确
- C++ 映射查找找不到特定键
- 设置::查找() 找不到