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年需要的代码。很高兴地说,这是可行的。