当前位置:  开发笔记 > 编程语言 > 正文

使用二进制搜索错误?

如何解决《使用二进制搜索错误?》经验,为你挑选了1个好方法。

大概做错了什么?尝试使用二进制搜索从数组中删除类中的实例.实例在创建时添加到数组中,但是当我从场景中删除它时,我希望它们也从数组中删除.以某种方式,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;
            }
        }
    }
}

对于调试我首先cout搜索结果,然后我尝试擦除的实例,然后是阵列中存在的所有实例.

现在我在控制台中的输出如下:

删除第一个实例输出:

发现?: 1实例:05DCB358 0:05DCAED8 1:05DCB358 2:05DCADB8

好的,所以一切顺利,找到实例,实例标识符与数组中的第二个实例相同.一切都很好.

删除第二个实例输出:

发现?:0实例:05DCADB8 0:05DCAED8 1:05DCADB8

所以我尝试删除的下一个实例就是这种情况.二进制搜索找不到实例(但是你可以看到它仍然作为数组的第二个实例出现在数组中).因为它返回false,所以实例不会被删除,即使我的输出确认实例存在,但是binary_search说它不是?

谁知道这里发生了什么?



1> Zdeslav Vojk..:

binary_search 假设集合内容已经排序.

要使std :: binary_search成功,范围[first,last]必须至少部分排序,即它必须满足以下所有要求:

相对于元素

相对于!(value

对于所有元素,如果element

由于您没有指定自定义比较逻辑,因此将使用operator<它来比较指针的数值.

由于您的收藏内容如下:

0: 05DCAED8 1: 05DCB358 2: 05DCADB8

它们似乎没有排序(最后一个实际上具有最低值)因此binary_search失败.

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有