Почему я не могу получить доступ к размеру этого массива C ++? - PullRequest
0 голосов
/ 27 ноября 2018

Я новичок в C ++ и пытаюсь написать функцию для решения этой задачи.Код, который у меня есть, выглядит следующим образом:

#include <iostream>
#include <deque> 
#include <algorithm>
using namespace std;

void printKMax(int arr[], int n, int k){
    deque<int> subarray;
    int i = arr.size();
    int maxValues[n];

    while(i >= 0) { 
        while (subarray.size() < n) {
            subarray.push_back(arr[i]);
            arr.pop();
            --i;
        }
        maxValues.push(max_element(begin(subarray), end(subarray)));
        subarray.pop_front();
    }

    for (array<int>::iterator it=maxValues.begin(); it!=maxValues.end(); 
it++) { 
        cout << maxValues[*it] << " ";
    }

}

int main(){

    int t;
    cin >> t;
    while(t>0) {
        int n,k;
        cin >> n >> k;
        int i;
        int arr[n];
        for(i=0;i<n;i++)
            cin >> arr[i];
        printKMax(arr, n, k);
        t--;
    }
    return 0;
} 

Этот код выдает, помимо прочего, ошибку, говорящую:

"запрос на член" size "в" arr ", не относящегося к классу типа 'int *' int i = arr.size (); "

Может кто-нибудь помочь мне понять, что это значит?Пытаюсь ли я ссылаться на что-то извне класса, чтобы мне нужно было использовать указатель?Это проблема с тем, как массив объявлен?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

вы можете использовать этот оператор, чтобы получить длину массива

int length = (sizeof(arr)/sizeof(*arr));

0 голосов
/ 27 ноября 2018

Массив в стиле C не является объектом, и вы не можете вызвать size для него.Он вырождается в не более чем указатель, и если вы передадите его здесь

void printKMax(int arr[], int n, int k){

, тогда эта функция даже не узнает размер.Чтобы решить проблему, вам нужно передать размер отдельно, как другой параметр.В качестве альтернативы, вы можете просто использовать структуру данных, например std::vector, я бы рекомендовал это вместо использования простого массива в этой ситуации.Вместо int arr[n]; у вас будет std::vector<int> arr;.Затем вы можете запросить размер std::vector в вашей функции printKMax.Для доступа к вектору используется тот же синтаксис, что и для доступа к массиву, а заполнение вектора работает аналогично тому, как вы это делаете сейчас, с cin >> arr.

...