为什么 binary_search 没有按预期工作?

Why is binary_search not working as expected?

问题是找到数组中第一个在数组中至少重复一次的元素的索引。

输入:

7

1 3 4 5 3 7 2

#include <bits/stdc++.h>
#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int n;
    cin >> n;

    int a[n], curr = -1;
    int num = sizeof(a) / sizeof(a[0]);

    for (int i = 0; i < n; i++)
        cin >> a[i];

    for (int i = 0; i < n; i++)
    {
        int x = a[i];
        a[i] = -1;
        if (binary_search(a, a + num, x))
        {
            curr = i;
            cout << curr << endl;
            break;
        }
    }
    cout << curr + 1;
    return 0;
}

预期输出: 2个 (因为3是数组中第一个出现两次的元素)

收到的输出: 0

cin >> n;

int a[n]

这在 C++ 中是不允许的。数组变量的大小必须是编译时常量。 n 不是编译时常量。要创建运行时长度数组,您必须动态分配它。最简单的解决方案是使用 std::vector

int num = sizeof(a) / sizeof(a[0]);

改为使用std::size(a) 获取数组的大小。但是,在这种情况下,只需使用 n.

binary_search(a, a + num, x)

必须对输入范围进行部分排序才能对搜索到的数字使用 std::binary_search。由于您可能使用所有元素作为搜索数字,这实际上意味着数组必须完全排序。

Input:

7

1 3 4 5 3 7 2

您的输入数组未完全排序。由于违反了 pre-condition,程序的行为未定义。