错误:从类型为“ std :: vector <int> *”的右值对类型为“ std :: vector <int>&”的非常量引用进行了无效的初始化

时间:2019-10-20 06:46:18

标签: c++ vector

我是C ++中STL的新手。我有这段代码,我试图在向量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 个答案:

答案 0 :(得分:1)

您可能肯定要替换此:

    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

答案 1 :(得分:0)

我们来剖析错误消息:

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>*。这是因为像vector<int> v[10000];这样的c样式数组只是指针。括号中的数字仅告诉编译器他应在堆栈上分配多少内存以满足该数组的内存要求。 因此,如果您想将其传递给函数,则可以通过多种方式来实现。用vector<int> &vecvec[]替换vector<int>* vecvec可能是最快的解决方案。

但是,针对您的问题的更合适解决方案可能是使用std::vector<std::vector<int>> v;,如“ lenik”的建议,因为您可以使用v.resize(10000)调整其大小并使用{{1 }(在遍历矢量元素时始终使用它)。您可以使用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;)。它是围绕c样式数组的包装器类,它为您提供了额外的功能,例如存储数组的大小,您可以使用与#include <array>std::vector)中相同的方式来获取它。

附加说明: 每个引用v.size()都不需要传递num。如果您不想在函数中修改它们的值,则int&intfloat等基本类型应始终按值而不是按引用传递。