向量<向量<double >>运算符

时间:2019-06-04 17:29:54

标签: c++

我要修改

vector <vector <double>>

main()中由另一个函数声明。
我将指针作为函数参数传递给向量;不幸的是,一旦我尝试修改向量,就会出现分割错误。

最初这是我的代码:

#include <vector>
#include <iostream>

using namespace std;
void function(vector <vector <double>> *result, int k){
    double r = 0.2;
    for(int i=0;i<5;i++){
        r = r*0.2;
        result[k][i].push_back(r);
    }
}

int main(){
    vector <vector <double>> result;
    for(int i=0;i<5;i++) function(&result, i);

    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++) cout << result[i][j] << " ";
        cout << " " << endl;
    }
    return 0;
}

使用“ g ++”进行的编译很好,但是运行程序时出现了分段错误。
我认为问题出在操作符[]的使用上,因为我将其应用于指针,所以我可能需要类似的东西:

result->operator[](k)->operator[](i).push_back(r);
我尝试过的

但不幸的是没有编译。

编辑: 我在result [k] [i]上使用了“ push_back()”,这是一个两倍。

我修改过:

result[k][i].push_back(r);

在:

res[k][i]=r;

但我仍然遇到细分错误:/

编辑2: 问题在于向量的向量的声明。我没有指定尺寸。看起来应该像这样:

vector <vector <double>> result(int size);

2 个答案:

答案 0 :(得分:7)

只需通过引用传递向量即可:

//                     -------------v
void function(vector<vector<double>>& res, int k){
    //some calculations
    for(int i=0;i<5;i++){
        //calculations which give r (double) as result
        res[k].push_back(r);
    }
}

如果您真的想通过指针传递它,则必须取消引用它:

void function(vector<vector<double>>* res, int k){
    //some calculations
    for(int i=0;i<5;i++){
        //calculations which give r (double) as result
        (*res)[k].push_back(r);
    }
}

正如@gambinaattori所说,您不能推回double,而不能推回最外层向量中的向量。

您还需要先用向量填充向量。如果向量的第一级为空,则由于没有向量,因此无法将第二级推回。

使用一束空向量初始化向量的向量是这样的:

std::vector<std::vector<double>> result(5);

现在有5个空向量。

然后要通过引用传递,您需要从参数中删除&符号:

function(result, i);

Here's a live example

答案 1 :(得分:3)

在您的示例中,res[k][i]是双精度的,而不是向量的,因此在其上调用push_back会给您带来麻烦。呼叫res[k].push_back(r)或直接输入res[k][i] = r。另外,您可能希望通过引用而不是指针传递矢量。