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

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

本文关键字:函数 begin int 调用      更新时间:2023-10-16

获取错误

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

我正在使用向量数组以及集合,但无法找出错误的原因
P。我在谷歌上搜索了一下,但也找不到任何相关的东西。我试着调试它,但做不到。这是我的密码!

#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 Happyn"; }
else if (!flag) {
cout << "Poor Chefn";
}
}
return 0;
}

您的问题是可变大小的数组不是C++标准的一部分,并且您正在代码中使用它。

使用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]);     }
    

    看起来您正在尝试使用一个数组来填充CCD_ 1。这可以很容易地通过std::iota。也就是说,以下内容相当于您编写的for loop

    std::iota(a.begin(), a.end(), 0);
    
  2. 其次,你正在做这么多复制,这看起来不像好的算法。特别是,应对集合sa,并再次将其应对回另一个向量(vec(。这绝对不是你我想是想要。

  3. 您不需要在矢量/阵列a上使用std::find。既然是按排序数组索引阵列之间的关系元素具有差异1,请利用此信息查找索引。


PS:不要使用#include<bits/stdc++.h>,请参阅本文了解更多信息和使用命名空间std;不是一个好的编码实践。