可能做错了什么?尝试使用二进制搜索从数组中删除类中的实例。实例在创建时添加到数组中,但是当我从场景中删除它时,我希望它们也从数组中删除。以某种方式,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:05DCB358 2: 05DCADB8
好的,所以一切顺利,找到实例,实例标识符与数组中的第二个实例相同。一切都很好。
删除第二个实例输出:
发现?:0实例:05DCADB8 0:05DCAED8 1:05DCADB8
因此,我尝试删除的下一个实例,会发生这种情况。二进制搜索找不到实例(但是你可以看到它仍然作为数组的第二个实例出现在数组中)。因为它返回false,所以实例不会被删除,即使我的输出确认实例存在,但是binary_search说它不是?
有人知道这里发生了什么吗?
答案 0 :(得分:6)
binary_search
假设集合内容已经排序。
要使std :: binary_search成功,范围[first,last]必须为 至少部分有序,即它必须满足以下所有要求 要求:
- 关于元素&lt;分区value或comp(元素,值)
- 相对于!(值&lt;元素)或!comp(value,element)
进行分区- 对于所有元素,如果元素&lt; value或comp(element,value)为true!(value&lt; element)或!comp(value,element)也为真
由于您没有指定自定义比较逻辑,因此它将使用operator<
来比较指针的数值。
由于您的收藏内容是:
0: 05DCAED8 1: 05DCB358 2: 05DCADB8
它们似乎没有排序(最后一个实际上具有最低值),因此binary_search
失败。