没有匹配的函数可以调用'begin(int [n])'

时间:2018-11-04 06:02:12

标签: c++ arrays algorithm compiler-errors stdvector

获取错误

no matching function for call to 'begin(int [n])'

我正在使用 vectors array set ,但是找不到错误的原因。 附言-我搜索了它,但也找不到任何相关的信息。 我尝试调试它,但无法完成。 这是我的代码!

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

int main() 
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        int n, flag = 0;
        scanf("%d", &n);
        int a[n];
        for (int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }
        int index1 = distance(begin(a), find(begin(a), end(a), 2));
        std::set<int> sa(a, a + n);
        std::vector<int> vec(sa.size());
        std::copy(sa.begin(), sa.end(), vec.begin());
        int arr[vec.size()];
        copy(vec.begin(), vec.end(), arr);
        for (int i = 0; i < vec.size(); i++) {
            for (int j = 0; j < n; j++) {
                if (arr[i] == a[j]) {
                    int index1 = distance(begin(a), find(begin(a), end(a), i));
                    int index2 = distance(begin(a), find(begin(a), end(a), j));
                    if (index1 < n && index2 < n) {
                        flag = 1;
                        break;
                    }
                }
            }
        }
        if (flag) { cout << "Truly Happy\n"; }
        else if (!flag) {
            cout << "Poor Chef\n";
        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您的问题是可变大小的数组are not part of C++ standards,您正在代码中使用它。

使用std::vector<>代替它们。那就是说,改变这个

int a[n]; // to ----------------------------> std::vector<int> a(n);

和这一行

std::set<int> sa(a, a + n); // to ----------> std::set<int> sa(a.begin(), a.end());

int arr[vec.size()]; // to -----------------> std::vector<int> arr(vec.size());
copy(vec.begin(), vec.end(), arr); // to ---> copy(vec.begin(), vec.end(), arr.begin());

然后您的代码将起作用。

但是

  1. 在这里

    for (int i = 0; i < n; i++) {  scanf("%d", &a[i]);     }
    

    您似乎正在尝试用数组填充元素 0, 1, 2,... , n-1。这很容易做到 std::iota。也就是说,以下内容等同于您编写的for loop

    std::iota(a.begin(), a.end(), 0);
    
  2. 其次,您正在进行大量复制,看起来并不像 好的算法。特别是,应对 set sa,然后再次将其应对回另一个向量(vec)。绝对不是你 我想吧。

  3. 您不需要在向量/数组std::find上使用a。因为它是 按 array index array之间的关系排序 元素1不同,请利用此信息查找 索引。


PS :请勿使用#include<bits/stdc++.h>,请参见this post for more infousing namespace std;并不是良好的编码习惯。