ошибка: неверная инициализация неконстантной ссылки типа 'std :: vector <int>&' из значения типа 'std :: vector <int>*' - PullRequest
0 голосов
/ 20 октября 2019

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

 error: invalid initialization of non-const reference of type ‘std::vector<int>&’ from an rvalue of type ‘std::vector<int>*’
         int val = happiness(n,v);

Код здесь:

int main(){
        int n;
        cin >> n;
        vector<int> v[10000];
        //vector<int> v(10000);
        //int val;

        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
              int temp;
              cin >> temp;
              v[i].push_back(temp);
         }

        }

        int val = happiness(n,v);

//      return 0;

}

Пожалуйста, дайте мне знать, как следуетЯ понимаю эту ошибку и исправляю ее.

Вот определенная функция happiness:

int happiness(int &num, vector<int> &vecvec[]){
       vector<int> pdp(10000,0);
       int sum = 0;
       int tempsum = -100;
       int max_curr_ind = -1;
       int i,j;
        for(i = 0; i < num; i++){
                for(j = 0; j < num; j++){
                        if(vecvec[i,j] >= tempsum && j != max_curr_ind){
                                tempsum = vecvec[i,j];
                                max_curr_ind = j;
                        }
                }
                sum = sum + tempsum;
                pdp[i,max_curr_ind] = sum;
                tempsum = -100;

        }
        cout << pdp[i,max_curr_ind] << endl;
        return pdp[i,max_curr_ind];

}

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Вы можете определенно захотеть заменить это:

    vector<int> v[10000];
    //vector<int> v(10000);
    //int val;

    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
          int temp;
          cin >> temp;
          v[i].push_back(temp);
       }
    }

на это:

vector<vector<int> > v;
for( int i=0; i<n; i++) {
    vector<int> temp;
    for( int j=0; j<n; j++) {
        int tmp;
        cin >> tmp;
        temp.push_back( tmp );
    }
    v.push_back( temp );
}

И затем определите:

int happiness(int &num, vector<vector<int> >& vecvec)

, чтобы иметь возможность пройтиv как есть.

0 голосов
/ 20 октября 2019

Давайте разберем сообщение об ошибке:

invalid initialization of non-const reference of type ‘std::vector<int>&’ ...
... int val = happiness(n,v);          

Это говорит о том, что ваша функция ожидает std::vector<int>& в вызове функции int val = happiness(n,v).

from an rvalue of type ‘std::vector<int>*’

Это говорит вам, чтовы фактически предоставляете, std::vector<int>*. Это потому, что массивы в стиле c, такие как vector<int> v[10000];, являются просто указателями. Число в скобках просто указывает компилятору, сколько памяти он должен выделить в стеке, чтобы удовлетворить требования к памяти этого массива. Так что, если вы хотите передать это своей функции, вы можете сделать это несколькими способами. Замена vector<int> &vecvec[] на vector<int>* vecvec, вероятно, будет самым быстрым решением.

Однако более подходящим решением вашей проблемы, вероятно, является использование std::vector<std::vector<int>> v;, как предложено в ответе "lenik", потому что вы можете изменить его размер с помощью v.resize(10000) и получить текущий размер с помощью v.size() (Всегда используйте это при цикле по векторным элементам). Вы можете передать его непосредственно вашей функции, используя std::vector<std::vector<int>>&. Кроме того, вам не нужно передавать num вашей функции, если вы измените размер массива на введенное вами число:

...
cin >> n;
std::vector<std::vector<int>> v(n);

или

...
cin >> n;
std::vector<std::vector<int>> v;
v.resize(n);

Тогда ваши циклы будут

for(int i=0; i < v.size(); i++){
        ...
        for(int j=0; j < v.size(); j++){
        ...
        }
     ...
     }

В качестве альтернативы, если вы знаете, что ваш массив векторов всегда имеет постоянный размер, вы также можете использовать std::array<std::vector<int>, 10000> v; (#include <array>). Это класс-оболочка для массива c-style, который дает вам дополнительные функциональные возможности, такие как сохранение размера массива, который вы можете получить таким же образом, как в std::vector (v.size()).

Дополнительное примечание: Нет необходимости передавать num для ссылки int&. Фундаментальные типы, такие как int, float, double и т. Д., Всегда должны передаваться по значению, а не по ссылке, если вы не собираетесь изменять их значение внутри функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...