使用二进制搜索错误
Using binary search wrong?
可能做错了什么?尝试使用二进制搜索从数组中的类中删除实例。实例在创建时会添加到阵列中,但当我从场景中删除它们时,我希望它们也从阵列中删除。不知怎的,binary_search在第一次删除时工作得很好,但在删除第二个实例时却不行。
如果在数组中找到实例,则binary_search应返回true。但当实例确实存在于数组中时,它返回false。
这是我正在使用的代码。
void Manager::eraseInstance(SomeInstance* instance) {
cout<< " found?: " << binary_search(instanceArray.begin(), instanceArray.end(), instance) << " instance: " << instance;
for (int i = 0; i < instanceArray.size(); i++) {
cout << " " << i << ": " << instanceArray[i];
}
cout << endl;
if (binary_search(instanceArray.begin(), instanceArray.end(), instance)) {
for (int i = 0; i < instanceArray.size(); i++) {
if (instanceArray[i] == instance) {
instanceArray.erase(instanceArray.begin() + (i));
delete instance;
}
}
}
}
为了进行调试,我首先计算搜索结果,然后是我试图擦除的实例,然后是数组中存在的所有实例。
现在我在控制台中的输出如下:
删除第一个实例输出:
找到了吗?:1个实例:05DCB358 0:05DCAED8 1:05DCB3582:05DCADB8
好的,一切都很顺利,找到了实例,实例标识符与数组中的第二个实例相同。一切都很好。
删除第二个实例输出:
找到了吗?:0实例:05DCADB8 0:05DCAED8 1:05DCADB8
所以在我试图删除的下一个实例中,会发生这种情况。二进制搜索无法找到实例(但正如您所看到的,它仍然作为数组的第二个实例存在于数组中)。因为它返回false,所以实例没有被删除,即使我的输出确认实例存在,但binary_search说它不存在?
有人知道这里发生了什么吗?
binary_search
假设集合内容已经排序。
要使std::binary_search成功,范围[first,last)必须在最少部分排序,即它必须满足以下所有条件要求:
- 相对于元素<value或comp(元素,值)
- 关于分区!(value<element)或!comp(值,元素)
- 对于所有元素,如果元素<value或comp(element,value)为true!(value<element)或!comp(value,element)也是true
由于您没有指定自定义比较逻辑,它将使用operator<
来比较指针的数值。
由于您的收藏内容如下:
0: 05DCAED8 1: 05DCB358 2: 05DCADB8
它们似乎没有排序(最后一个实际上具有最低值),因此binary_search
失败。
- 提升图广度优先搜索前置编译错误
- 在二叉搜索树中插入时出现分段错误
- C++:使用类在向量中搜索特定元素时,我得到了错误的结果
- 二叉搜索树的 C++ 实现中的EXC_BAD_ACCESS错误
- 为什么二叉搜索函数会抛出错误?
- 编译时二叉搜索树错误的反向迭代器表示"no matching function call for operator=()"
- C++二叉搜索树会产生分段错误
- 递归除法和二分搜索中的错误
- 为什么在链接时搜索使用错误工具集的提升库?
- 我的模板二叉搜索树类给出了错误"Node<T>: no appropriate default constructor available,"如何解决这个问题?
- 搜索 ID 不能用作函数错误
- 构建二叉搜索树时的分段错误
- 搜索链表时出现隔离错误
- 二进制搜索树操作程序错误:分割故障(核心倾倒)
- 错误 C2676;在C++的二叉搜索树类中定义 ++ 运算符时遇到问题
- C++ - 第二次二叉搜索的分段错误
- 用于二分搜索的错误简单功能(C++)
- C++搜索文件名指针指向字符串 strcmp 错误
- 为什么此函数中的运行时错误 C++ 深度优先搜索
- QT错误:搜索不存在的函数