C++ C++;向量<;向量<;双倍>&燃气轮机;加倍**

C++ C++;向量<;向量<;双倍>&燃气轮机;加倍**,c++,pointers,vector,C++,Pointers,Vector,我试图将vector类型的变量传递给函数F(double**mat,int m,int n)。F函数来自另一个库,因此我没有修改它的选项。有人能给我一些提示吗?谢谢。在我看来,您需要将向量转换为正确的数据类型,并在此过程中将所有值复制到嵌套数组中 向量的组织方式与数组完全不同,因此即使您可以强制数据类型匹配,它仍然无法工作 遗憾的是,我的C++经验在几年前就出现了,所以我不能给你一个具体的例子。 < p>向量< vector >双>与M.的双指针几乎不一样。从外观上看,m被假定为一个二维数组,而

我试图将
vector
类型的变量传递给函数
F(double**mat,int m,int n)
。F函数来自另一个库,因此我没有修改它的选项。有人能给我一些提示吗?谢谢。

在我看来,您需要将
向量
转换为正确的数据类型,并在此过程中将所有值复制到嵌套数组中

向量的组织方式与数组完全不同,因此即使您可以强制数据类型匹配,它仍然无法工作


遗憾的是,我的C++经验在几年前就出现了,所以我不能给你一个具体的例子。

< p>向量< vector >双>与M.的双指针几乎不一样。从外观上看,m被假定为一个二维数组,而向量可以交错存储,并且在内存中不一定相邻。如果要传入,则需要将向量值复制到temp 2dim double数组中,作为传入值。

vector
double**
是完全不同的类型。但是,可以借助另一个存储一些双指针的向量为该函数提供数据:

#include <vector>

void your_function(double** mat, int m, int n) {}

int main() {
    std::vector<std::vector<double>> thing = ...;
    std::vector<double*> ptrs;
    for (auto& vec : thing) {
        //   ^ very important to avoid `vec` being
        // a temporary copy of a `thing` element.
        ptrs.push_back(vec.data());
    }
    your_function(ptrs.data(), thing.size(), thing[0].size());
}
#包括
使你的函数无效(双**mat,int m,int n){}
int main(){
向量事物=。。。;
std::载体ptrs;
用于(自动和矢量控制:对象){
//^避免使用“vec”非常重要
//“thing”元素的临时副本。
ptrs.push_back(向量数据());
}
你的函数(ptrs.data(),thing.size(),thing[0].size());
}
这样做的原因之一是因为
std::vector
保证所有元素都连续存储在内存中


如果可能的话,考虑改变你的函数的签名。通常,矩阵在内存中是线性排列的。这意味着,可以使用左上角系数类型的一些基本指针
p
,以及一些基于行和列的计算线性索引来访问矩阵元素,如
p[row*row\u step+col*col\u step]
,其中
row\u step
col\u step
是依赖于布局的偏移量。标准库对于这些类型的数据结构并没有提供任何帮助。但是您可以尝试使用Boost的
multi_array
或GSL的
multi_span
来帮助您完成这项工作。

您能更新这个吗,或者介意我用一个调用
data
的版本来更新它,而不是获取第一个元素的地址吗?太棒了。谢谢。这是最好的答案,我正在编写一些2021年需要的代码。很高兴地说,这是可行的。