нет соответствующей функции для вызова функции begin (int [n]) ' - PullRequest
0 голосов
/ 04 ноября 2018

Получение ошибки

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

Я использую векторы и массив и 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 голосов
/ 04 ноября 2018

Ваша проблема в массивах переменного размера , которые не являются частью стандартов 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]);     }
    

    похоже, что вы пытаетесь получить элементы заполнения массива из 0, 1, 2,... , n-1. Это может быть легко сделано станд :: йота . Это означает, что следующее эквивалентно for loop, который вы написали.

    std::iota(a.begin(), a.end(), 0);
    
  2. Во-вторых, вы делаете так много копий, которые не похожи на хороший алгоритм. В частности, копирование с набором sa и повторное копирование его обратно в другой вектор (vec). Это точно не ты хочу, я думаю.

  3. Вам не нужно использовать std::find для вектора / массива a. Так как это в отсортированном порядке соотношение между индексом массива и массивом элемент имеет значение 1, используйте эту информацию, чтобы найти индекс.


PS : не использовать #include<bits/stdc++.h>, см. этот пост для получения дополнительной информации и использование пространства имен std; не является хорошей практикой кодирования.

...