vector <vector <double>> operator

3

我想修改一个

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++"编译没有问题,但运行程序时出现了分段错误。
我认为问题在于使用operator[]时应用到了指针上,所以我可能需要类似这样的东西:

result->operator[](k)->operator[](i).push_back(r);

我尝试编译以下代码,但不幸的是无法通过。

编辑: 我在result[k][i]上使用了“push_back()”,而其是一个double类型。

我进行了修改:

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

在:

res[k][i]=r;

但我仍然遇到分段错误 :/
编辑2: 问题在于向量的向量声明上; 我没有指定大小。应该像这样:

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

1
请修复您的代码以使其能够编译。" in main(): 不行。建议提供一个 [mcve]。 - Jesper Juhl
1
在这个函数中,你写了 res[k],但这只有在 k == 0 的时候才是正确的。好好想一想,记住 res 到底代表什么意思... - Some programmer dude
4
为什么要通过指针传递std::vector,而不是通过引用来传递,这样可以使代码更加清晰,并且同时解决问题? - Yksisarvinen
抱歉,第一段代码不完整,我已经更新了它! - LucioPhys
由于您从未向其添加任何内容,因此main中的result为空。 - 1201ProgramAlarm
2个回答

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.


我实际上尝试了两个版本,但都没有起作用,代码与你的完全相同;有什么建议吗?谢谢 :) - LucioPhys
@LucioPhys 我提供了一个实时示例和更多的解释。 - Guillaume Racicot
非常感谢!:D 现在它可以工作了,我在声明中漏掉了大小! - LucioPhys

3
在你的例子中,res[k][i] 是一个double类型的变量,而不是一个向量,所以调用 push_back 方法会出错。应该使用 res[k].push_back(r) 或者直接写成 res[k][i] = r。此外,你可能需要通过引用传递向量,而不是通过指针。

3
function()内部,result[k][i]实际上是一个vector<double>&,否则它就不会编译。 res[k]解除了指针(当k=0时是唯一有效的值),然后res[k][i]检索其中一个内部向量。 - Yksisarvinen
谢谢!现在我明白我哪里出错了! - LucioPhys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接